-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMerge_k_Sorted_Lists.cc
86 lines (79 loc) · 2.12 KB
/
Merge_k_Sorted_Lists.cc
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include <vector>
#include <iostream>
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
private:
ListNode *merge2Lists(ListNode* list1, ListNode* list2)
{
if (!list1)
return list2;
if (!list2)
return list1;
ListNode* p1 = list1;
ListNode* p2 = list2;
ListNode* head = NULL;
ListNode* last = NULL;
while(p1 && p2)
{
int val1 = p1->val;
int val2 = p2->val;
if (val1 > val2)
{
if (!head)
{
head = p2;
last = p2;
}
else
{
last->next = p2;
last = last->next;
}
p2 = p2->next;
}
else
{
if (!head)
{
head = p1;
last = p1;
}
else
{
last->next = p1;
last = last->next;
}
p1 = p1->next;
}
}
if (p1)
last->next = p1;
if (p2)
last->next = p2;
return head;
}
public:
ListNode *mergeKLists(vector<ListNode *> &lists)
{
if (lists.size() == 0)
return NULL;
if (lists.size() == 1)
return lists[0];
int i = 0;
while (i != lists.size())
{
if ( i + 1 == lists.size())
return lists[i];
if ( i + 1 < lists.size())
{
ListNode *merged = merge2Lists(lists[i], lists[i+1]);
lists.push_back(merged);
}
i = i + 2;
}
}
};