LeetCode_23 合併K個排序鏈表

題目描述:
合併 k 個排序鏈表,返回合併後的排序鏈表。請分析和描述算法的複雜度。

示例:

輸入:
[
1->4->5,
1->3->4,
2->6
]
輸出: 1->1->2->3->4->4->5->6

思路:
根據題目可知,同一個鏈表內部是排好序的,無需再進行比較,所以只需要比較不同鏈表中的元素大小即可。這裏考慮使用priority_queue優先隊列,優先隊列內部是通過堆排序的方法實現了有序。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
	//仿射函數:實際上是定義一個結構體,並在內部實現一個operator()方法,使其具有函數的功能
    //在結構體內寫一個仿射函數效率高
    //優先級隊列是反着排序的
    struct cmp{
        bool operator()(ListNode* a,ListNode* b){
            return a->val>b->val;
        }
    };
    
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        if(lists.empty())
            return NULL;
        priority_queue<ListNode*,vector<ListNode*>,cmp> pq;
        ListNode* head=new ListNode(-1);
        ListNode* p=head;
        for(auto it:lists){
            if(it){
                pq.push(it);
            }
        }
        while(!pq.empty()){
            ListNode* now=pq.top();
            pq.pop();
            p->next=now;
            p=p->next;
            if(now->next)
                pq.push(now->next);
        }
        return head->next;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章