Skip to content

Commit 3811b89

Browse files
committed
feat: add swift implementation to lcof2 problem: No.026
1 parent be05c9b commit 3811b89

File tree

2 files changed

+131
-0
lines changed

2 files changed

+131
-0
lines changed

lcof2/剑指 Offer II 026. 重排链表/README.md

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,74 @@ func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {
288288
}
289289
```
290290

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+
291359
<!-- tabs:end -->
292360

293361
<!-- solution:end -->
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
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+
}

0 commit comments

Comments
 (0)