/
sort-list-merge-sort.cpp
129 lines (102 loc) · 2.32 KB
/
sort-list-merge-sort.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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include <cstdio>
struct ListNode
{
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution
{
public:
ListNode *sortList(ListNode *head)
{
if (!head) {
return NULL;
}
int length = 0;
ListNode *p = head;
while (p) {
length++;
p = p->next;
}
return mergesort(head, length);
}
private:
ListNode *mergesort(ListNode *head, int length)
{
if (!head) {
return NULL;
}
if (length == 1) {
return head;
}
int mid_index = length / 2;
ListNode *left, *right;
ListNode *mid = head, *pre = NULL;
for (int i = 0; i < mid_index; ++i) {
pre = mid;
mid = mid->next;
}
if (pre) {
pre->next = NULL;
left = head;
} else {
left = NULL;
}
right = mid;
left = mergesort(left, mid_index);
right = mergesort(right, length - mid_index);
return merge(left, right);
}
ListNode *merge(ListNode *h1, ListNode *h2)
{
if (!h1) {
return h2;
}
if (!h2) {
return h1;
}
ListNode *head, *tail;
head = tail = NULL;
while (h1 && h2) {
ListNode *temp;
if (h1->val < h2->val) {
temp = h1;
h1 = h1->next;
} else {
temp = h2;
h2 = h2->next;
}
if (!head) {
head = temp;
} else {
tail->next = temp;
}
tail = temp;
temp->next = NULL;
}
if (h1) {
tail->next = h1;
} else if (h2) {
tail->next = h2;
}
return head;
}
};
int main(int argc, char *argv[])
{
ListNode node1(1), node2(2), node3(3), node4(4), node5(5);
ListNode *head = &node5;
node5.next = &node4;
node4.next = &node3;
node3.next = &node2;
node2.next = &node1;
Solution solution;
head = solution.sortList(head);
while (head) {
printf("%d ", head->val);
head = head->next;
}
printf("\n");
return 0;
}