-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path0148. Sort List.js
99 lines (88 loc) · 1.81 KB
/
0148. Sort List.js
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
// Sort a linked list in O(n log n) time using constant space complexity.
// Example 1:
// Input: 4->2->1->3
// Output: 1->2->3->4
// Example 2:
// Input: -1->5->3->4->0
// Output: -1->0->3->4->5
// 1) 时间复杂度 O(n^2)
// 感觉写的很复杂,不够清晰
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
function ListNode(val) {
this.val = val
this.next = null
}
const sortList = (head) => {
let newHead = new ListNode(null)
let preHead = new ListNode(null)
preHead.next = head
let pre = preHead
let cur = preHead.next
let min = null
let newCur = newHead
while (preHead.next) {
while (cur && cur.next) {
min = pre.next
if (min.val > cur.next.val) {
pre = cur
min = cur.next
}
cur = cur.next
}
pre.next = pre.next.next
if (min) {
min.next = null
newCur.next = min
} else {
newCur.next = cur
return newHead.next
}
min = null
newCur = newCur.next
pre = preHead
cur = preHead.next
}
return newHead.next
}
// Runtime: 2160 ms, faster than 5.10% of JavaScript online submissions for Sort List.
// Memory Usage: 39.7 MB, less than 100.00% of JavaScript online submissions for Sort List.
// Test case:
// let head1 = {
// val: -1,
// next: {
// val: 2,
// next: {
// val: 1,
// next: {
// val: 3,
// next: null
// }
// }
// }
// }
// let head2 = {
// val: 4,
// next: {
// val: 1,
// next: null
// }
// }
// let head3 = {
// val: 4,
// next: null
// }
// let head4 = null
// console.log(sortList(head1))
// console.log(sortList(head2))
// console.log(sortList(head3))
// console.log(sortList(head4))