1 题目
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
Example:
Input:
[
1->4->5,
1->3->4,
2->6
]
Output: 1->1->2->3->4->4->5->6
2 尝试解
2.1 分析
给定一组有序链表,要求将其合并为一个有序链表。
类似于Merge Sort的合并阶段,每次取所有链表的队首中最小的一个放入即可。可以用一个小顶堆,按照节点值由小到大排序。每次取堆顶元素放入新链表末尾。如果该节点所在的原链表仍未结束,将其后续节点压入堆中。
2.2 代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
struct cmp{
bool operator()(ListNode* A,ListNode* B){
return A->val > B->val;
}
};
ListNode* mergeKLists(vector<ListNode*>& lists) {
ListNode* head = new ListNode(-1);
ListNode* cur = head;
priority_queue<ListNode*,vector<ListNode*>,cmp> saver;
for(auto node : lists){
if(node)
saver.push(node);
}
while(saver.size()){
auto top = saver.top();
cur->next = top;
cur = cur->next;
saver.pop();
if(cur->next)
saver.push(cur->next);
}
return head->next;
}
};
3 标准解
3.1 分析
如果仅有两个链表,那么只要每次取其中小的一个合并即可。如果有多个链表,每次取出两个合并成为一个新的链表,直到所有链表合并完成。
3.2 代码
ListNode *mergeKLists(vector<ListNode *> &lists) {
if(lists.empty()){
return nullptr;
}
while(lists.size() > 1){
lists.push_back(mergeTwoLists(lists[0], lists[1]));
lists.erase(lists.begin());
lists.erase(lists.begin());
}
return lists.front();
}
ListNode *mergeTwoLists(ListNode *l1, ListNode *l2) {
if(l1 == nullptr){
return l2;
}
if(l2 == nullptr){
return l1;
}
if(l1->val <= l2->val){
l1->next = mergeTwoLists(l1->next, l2);
return l1;
}
else{
l2->next = mergeTwoLists(l1, l2->next);
return l2;
}
}