題目描述:
合併 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;
}
};