-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmergeKsortedLists.cpp
63 lines (52 loc) · 1.27 KB
/
mergeKsortedLists.cpp
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
51
52
53
54
55
56
57
58
59
60
61
62
63
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {
}
* };
*/
class Solution {
ListNode * merge(vector<ListNode *> * lists,int start,int end) {
if (start>end) return NULL;
if (start == end) return lists->at(start);
int mid = (start+end)/2;
ListNode * left = merge(lists,start,mid);
ListNode * right = merge(lists,mid+1,end);
ListNode * newhead = NULL;
ListNode * tmp = NULL;
ListNode * tail = NULL;
while (left!=NULL && right!=NULL) {
if (left->val<right->val) {
tmp = left;
left = left->next;
}
else {
tmp = right;
right = right->next;
}
if (newhead == NULL) {
newhead = tmp;
tail = tmp;
}
else {
tail->next = tmp;
tail = tail->next;
}
}
if (left!=NULL) {
if (newhead == NULL) return left;
tail->next = left;
}
if (right!=NULL) {
if (newhead == NULL) return right;
tail->next = right;
}
return newhead;
}
public:
ListNode *mergeKLists(vector<ListNode *> &lists) {
return merge(&lists,0,lists.size()-1);
}
};