diff --git "a/lcof2/\345\211\221\346\214\207 Offer II 026. \351\207\215\346\216\222\351\223\276\350\241\250/README.md" "b/lcof2/\345\211\221\346\214\207 Offer II 026. \351\207\215\346\216\222\351\223\276\350\241\250/README.md" index e7269f27d746e..b91b7a0cb6b6d 100644 --- "a/lcof2/\345\211\221\346\214\207 Offer II 026. \351\207\215\346\216\222\351\223\276\350\241\250/README.md" +++ "b/lcof2/\345\211\221\346\214\207 Offer II 026. \351\207\215\346\216\222\351\223\276\350\241\250/README.md" @@ -288,6 +288,74 @@ func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode { } ``` +#### Swift + +```swift +/** + * Definition for singly-linked list. + * public class ListNode { + * var val: Int + * var next: ListNode? + * init() { self.val = 0; self.next = nil; } + * init(_ val: Int) { self.val = val; self.next = nil; } + * init(_ val: Int, _ next: ListNode?) { self.val = val; self.next = next; } + * } + */ + +class Solution { + func reorderList(_ head: ListNode?) { + guard let head = head else { return } + + let mid = middleNode(head) + + let secondHalf = reverseList(mid.next) + mid.next = nil + + mergeTwoLists(head, secondHalf) + } + + private func middleNode(_ head: ListNode?) -> ListNode { + var slow = head + var fast = head + while fast != nil && fast?.next != nil { + slow = slow?.next + fast = fast?.next?.next + } + return slow! + } + + private func reverseList(_ head: ListNode?) -> ListNode? { + var prev: ListNode? = nil + var curr = head + while curr != nil { + let nextTemp = curr?.next + curr?.next = prev + prev = curr + curr = nextTemp + } + return prev + } + + private func mergeTwoLists(_ l1: ListNode?, _ l2: ListNode?) { + var l1 = l1 + var l2 = l2 + while l1 != nil && l2 != nil { + let l1Next = l1?.next + let l2Next = l2?.next + + l1?.next = l2 + if l1Next == nil { + break + } + l2?.next = l1Next + + l1 = l1Next + l2 = l2Next + } + } +} +``` + diff --git "a/lcof2/\345\211\221\346\214\207 Offer II 026. \351\207\215\346\216\222\351\223\276\350\241\250/Solution.swift" "b/lcof2/\345\211\221\346\214\207 Offer II 026. \351\207\215\346\216\222\351\223\276\350\241\250/Solution.swift" new file mode 100644 index 0000000000000..78beefe8b432f --- /dev/null +++ "b/lcof2/\345\211\221\346\214\207 Offer II 026. \351\207\215\346\216\222\351\223\276\350\241\250/Solution.swift" @@ -0,0 +1,63 @@ +/** + * Definition for singly-linked list. + * public class ListNode { + * var val: Int + * var next: ListNode? + * init() { self.val = 0; self.next = nil; } + * init(_ val: Int) { self.val = val; self.next = nil; } + * init(_ val: Int, _ next: ListNode?) { self.val = val; self.next = next; } + * } + */ + +class Solution { + func reorderList(_ head: ListNode?) { + guard let head = head else { return } + + let mid = middleNode(head) + + let secondHalf = reverseList(mid.next) + mid.next = nil + + mergeTwoLists(head, secondHalf) + } + + private func middleNode(_ head: ListNode?) -> ListNode { + var slow = head + var fast = head + while fast != nil && fast?.next != nil { + slow = slow?.next + fast = fast?.next?.next + } + return slow! + } + + private func reverseList(_ head: ListNode?) -> ListNode? { + var prev: ListNode? = nil + var curr = head + while curr != nil { + let nextTemp = curr?.next + curr?.next = prev + prev = curr + curr = nextTemp + } + return prev + } + + private func mergeTwoLists(_ l1: ListNode?, _ l2: ListNode?) { + var l1 = l1 + var l2 = l2 + while l1 != nil && l2 != nil { + let l1Next = l1?.next + let l2Next = l2?.next + + l1?.next = l2 + if l1Next == nil { + break + } + l2?.next = l1Next + + l1 = l1Next + l2 = l2Next + } + } +} \ No newline at end of file