File tree Expand file tree Collapse file tree 2 files changed +131
-0
lines changed
lcof2/剑指 Offer II 026. 重排链表 Expand file tree Collapse file tree 2 files changed +131
-0
lines changed Original file line number Diff line number Diff line change @@ -288,6 +288,74 @@ func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {
288
288
}
289
289
```
290
290
291
+ #### Swift
292
+
293
+ ``` swift
294
+ /**
295
+ * Definition for singly-linked list.
296
+ * public class ListNode {
297
+ * var val: Int
298
+ * var next: ListNode?
299
+ * init() { self.val = 0; self.next = nil; }
300
+ * init(_ val: Int) { self.val = val; self.next = nil; }
301
+ * init(_ val: Int, _ next: ListNode?) { self.val = val; self.next = next; }
302
+ * }
303
+ */
304
+
305
+ class Solution {
306
+ func reorderList (_ head : ListNode? ) {
307
+ guard let head = head else { return }
308
+
309
+ let mid = middleNode (head)
310
+
311
+ let secondHalf = reverseList (mid.next )
312
+ mid.next = nil
313
+
314
+ mergeTwoLists (head, secondHalf)
315
+ }
316
+
317
+ private func middleNode (_ head : ListNode? ) -> ListNode {
318
+ var slow = head
319
+ var fast = head
320
+ while fast != nil && fast? .next != nil {
321
+ slow = slow? .next
322
+ fast = fast? .next ? .next
323
+ }
324
+ return slow!
325
+ }
326
+
327
+ private func reverseList (_ head : ListNode? ) -> ListNode? {
328
+ var prev: ListNode? = nil
329
+ var curr = head
330
+ while curr != nil {
331
+ let nextTemp = curr? .next
332
+ curr? .next = prev
333
+ prev = curr
334
+ curr = nextTemp
335
+ }
336
+ return prev
337
+ }
338
+
339
+ private func mergeTwoLists (_ l1 : ListNode? , _ l2 : ListNode? ) {
340
+ var l1 = l1
341
+ var l2 = l2
342
+ while l1 != nil && l2 != nil {
343
+ let l1Next = l1? .next
344
+ let l2Next = l2? .next
345
+
346
+ l1? .next = l2
347
+ if l1Next == nil {
348
+ break
349
+ }
350
+ l2? .next = l1Next
351
+
352
+ l1 = l1Next
353
+ l2 = l2Next
354
+ }
355
+ }
356
+ }
357
+ ```
358
+
291
359
<!-- tabs:end -->
292
360
293
361
<!-- solution:end -->
Original file line number Diff line number Diff line change
1
+ /**
2
+ * Definition for singly-linked list.
3
+ * public class ListNode {
4
+ * var val: Int
5
+ * var next: ListNode?
6
+ * init() { self.val = 0; self.next = nil; }
7
+ * init(_ val: Int) { self.val = val; self.next = nil; }
8
+ * init(_ val: Int, _ next: ListNode?) { self.val = val; self.next = next; }
9
+ * }
10
+ */
11
+
12
+ class Solution {
13
+ func reorderList( _ head: ListNode ? ) {
14
+ guard let head = head else { return }
15
+
16
+ let mid = middleNode ( head)
17
+
18
+ let secondHalf = reverseList ( mid. next)
19
+ mid. next = nil
20
+
21
+ mergeTwoLists ( head, secondHalf)
22
+ }
23
+
24
+ private func middleNode( _ head: ListNode ? ) -> ListNode {
25
+ var slow = head
26
+ var fast = head
27
+ while fast != nil && fast? . next != nil {
28
+ slow = slow? . next
29
+ fast = fast? . next? . next
30
+ }
31
+ return slow!
32
+ }
33
+
34
+ private func reverseList( _ head: ListNode ? ) -> ListNode ? {
35
+ var prev : ListNode ? = nil
36
+ var curr = head
37
+ while curr != nil {
38
+ let nextTemp = curr? . next
39
+ curr? . next = prev
40
+ prev = curr
41
+ curr = nextTemp
42
+ }
43
+ return prev
44
+ }
45
+
46
+ private func mergeTwoLists( _ l1: ListNode ? , _ l2: ListNode ? ) {
47
+ var l1 = l1
48
+ var l2 = l2
49
+ while l1 != nil && l2 != nil {
50
+ let l1Next = l1? . next
51
+ let l2Next = l2? . next
52
+
53
+ l1? . next = l2
54
+ if l1Next == nil {
55
+ break
56
+ }
57
+ l2? . next = l1Next
58
+
59
+ l1 = l1Next
60
+ l2 = l2Next
61
+ }
62
+ }
63
+ }
You can’t perform that action at this time.
0 commit comments