-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSortList.java
More file actions
90 lines (79 loc) · 2.24 KB
/
SortList.java
File metadata and controls
90 lines (79 loc) · 2.24 KB
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
package medium;
import util.ListNode;
import static util.Utils.initListNode;
/**
* ClassName: SortList.java
* Auther: chenyiAlone
* Create Time: 2019/4/28 10:29
* Description: No.148
* 思路:
*
*
*/
public class SortList {
private ListNode dummy = null;
public static void main(String[] args) {
ListNode head = initListNode(3, 4, 2, 1);
ListNode res = new SortList().sortList(head);
System.out.println(res);
}
private ListNode sortList(ListNode head) {
dummy = new ListNode(0);
dummy.next = head;
int len = 0;
while (head != null) {
head = head.next;
len++;
}
mergeSort(0, len - 1);
return dummy.next;
}
private void mergeSort(int lo, int hi) {
if (lo >= hi)
return;
int mid = (lo + hi) >> 1;
mergeSort(lo, mid);
mergeSort(mid + 1, hi);
// (0, 1]
ListNode pre = searchPre(lo);
int leftLen = mid - lo + 1;
int rightLen = hi - mid; // right sublist include mid node
mergeList(pre, leftLen, rightLen);
}
private void mergeList(ListNode pre, int leftLen, int rightLen) {
int offset = leftLen;
ListNode leftList = pre.next;
ListNode rightList = pre.next;
while (offset-- > 0) {
rightList = rightList.next;
}
while (leftLen > 0 || rightLen > 0) {
if (leftLen == 0) {
pre.next = rightList;
rightList = rightList.next;
rightLen--;
} else if (rightLen == 0) {
pre.next = leftList;
leftList = leftList.next;
leftLen--;
} else if (leftList.val < rightList.val) {
pre.next = leftList;
leftList = leftList.next;
leftLen--;
} else {
pre.next = rightList;
rightList = rightList.next;
rightLen--;
}
pre = pre.next;
}
pre.next = rightList;
}
private ListNode searchPre(int index) {
ListNode iter = dummy;
for (int i = 0; i < index; i++) {
iter = iter.next;
}
return iter;
}
}