23. Merge k Sorted Lists
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
维护一个最小堆,每次从堆中取最小的节点即可。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
// 定义比较函数,用于构建最小堆
static bool heapComp(ListNode* node1, ListNode* node2){
return node1->val > node2->val;
}
ListNode* mergeKLists(vector<ListNode*>& lists) {
ListNode* dummyHead = new ListNode(0);
ListNode* pCur = dummyHead;
vector<ListNode*> v;
for(int i = 0; i < lists.size(); ++i){
if(lists[i])
v.push_back(lists[i]);
}
make_heap(v.begin(), v.end(), heapComp);
while(!v.empty()){
// PCur连接堆顶最小的节点
pCur->next = v.front();
pCur = pCur->next;
// 将堆顶节点从堆中删掉
pop_heap(v.begin(), v.end(), heapComp);
v.pop_back();
// 如果这个链表还有后继节点,将它压入堆中
if(pCur->next){
v.push_back(pCur->next);
push_heap(v.begin(), v.end(), heapComp);
}
}
return dummyHead->next;
}
};