File tree 1 file changed +34
-29
lines changed
1 file changed +34
-29
lines changed Original file line number Diff line number Diff line change 16
16
17
17
class ReorderList {
18
18
func reorderList( head: ListNode ? ) {
19
- if head == nil || head! . next == nil {
19
+ guard let head = head else {
20
20
return
21
21
}
22
-
23
- // split the list
24
- var prev = head
25
- var post = head!. next
26
-
22
+
23
+ var prev : ListNode ? = head
24
+ var post : ListNode ? = head
25
+
26
+ _split ( & prev, & post)
27
+ prev = head
28
+
29
+ post = _reverse ( & post)
30
+
31
+ _merge ( & prev, & post)
32
+ }
33
+
34
+ private func _split( inout prev: ListNode ? , inout _ post: ListNode ? ) {
27
35
while post != nil && post!. next != nil {
28
36
prev = prev!. next
29
37
post = post!. next!. next
30
38
}
31
-
39
+
32
40
post = prev!. next
33
41
prev!. next = nil
34
- prev = head
35
-
36
- // reverse the second list
37
- post = _reverse ( post)
38
-
39
- // merge lists
40
- while prev != nil && post != nil {
41
- let preNext = prev!. next
42
- let posNext = post!. next
43
-
44
- prev!. next = post
45
- post!. next = preNext
46
-
47
- prev = preNext
48
- post = posNext
49
- }
50
42
}
51
-
52
- private func _reverse( head: ListNode ? ) -> ListNode ? {
43
+
44
+ private func _reverse( inout head: ListNode ? ) -> ListNode ? {
53
45
var prev = head
54
46
var temp : ListNode ?
55
-
47
+
56
48
while prev != nil {
57
49
let post = prev!. next
58
-
50
+
59
51
prev!. next = temp
60
-
52
+
61
53
temp = prev
62
54
prev = post
63
55
}
64
-
56
+
65
57
return temp
66
58
}
59
+
60
+ private func _merge( inout prev: ListNode ? , inout _ post: ListNode ? ) {
61
+ while prev != nil && post != nil {
62
+ let preNext = prev!. next
63
+ let posNext = post!. next
64
+
65
+ prev!. next = post
66
+ post!. next = preNext
67
+
68
+ prev = preNext
69
+ post = posNext
70
+ }
71
+ }
67
72
}
You can’t perform that action at this time.
0 commit comments