23. Merge k Sorted Lists
Description:
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
Difficulty:hard
Example:
Input:
[
1->4->5,
1->3->4,
2->6
]
Output: 1->1->2->3->4->4->5->6
方法1:堆
- Time complexity : O ( n ∗ l o g ( k ) ) O\left ( n*log(k)\right ) O(n∗log(k))
- Space complexity :
O
(
n
)
O\left ( n \right )
O(n)
思路:
我们首先把k个链表的首元素都加入最小堆中,它们会自动排好序。然后我们每次取出最小的那个元素加入我们最终结果的链表中,然后把取出元素的下一个元素再加入堆中,下次仍从堆中取出最小的元素做相同的操作,以此类推,直到堆中没有元素了,此时k个链表也合并为了一个链表,返回首节点即可,
struct compare{
bool operator()(ListNode* a, ListNode* b){
return a->val > b->val;
}
};
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
priority_queue<ListNode*, vector<ListNode*>, compare> q;
for(auto node : lists){
if(node) q.push(node);
}
ListNode *res = new ListNode(-1);
ListNode *cur = res;
while(!q.empty()){
auto top = q.top();
q.pop();
cur->next = top;
cur = cur->next;
if(cur->next)
q.push(cur->next);
}
return res->next;
}
};