1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
// Runtime: 20 ms, faster than 99.00% of C++ online submissions for Merge k Sorted Lists.
// Memory Usage: 21.8 MB, less than 5.95% of C++ online submissions for Merge k Sorted Lists.
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
//处理输入为空的情形
if(lists.empty()) return nullptr;
return merge(lists,0,lists.size()-1);
}
//递归实现分治
ListNode *merge(vector<ListNode *> &lists,int l,int r){
//若刚好可分解为两链表排序,则调用mergeTwoLists处理
if(l-r==1) return mergeTwoLists(lists[l],lists[r]);
//若只有一个链表,直接返回
if(l==r) return lists[l];
//分治
int m=(l+r)/2;
ListNode *list1=merge(lists,l,m);
ListNode *list2=merge(lists,m+1,r);
return mergeTwoLists(list1,list2);
}
private:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
//建立dummy节点和添加结果用的tail指针
ListNode *dummy=new ListNode;
ListNode *tail=dummy;
//当两个链表都未走到头时,比较两个节点
while(l1 && l2){
//保证l1节点比l2节点小
if(l1->val > l2->val) swap(l1,l2);
//将更小的节点放入结果链表中,继续走
tail->next=l1;
tail=tail->next;
l1=l1->next;
}
//循环终止时可能有一个链表尾部非空,直接放到结果后面
tail->next=l1?l1:l2;
return dummy->next;
}
};
|