diff --git "a/lcof2/\345\211\221\346\214\207 Offer II 077. \351\223\276\350\241\250\346\216\222\345\272\217/README.md" "b/lcof2/\345\211\221\346\214\207 Offer II 077. \351\223\276\350\241\250\346\216\222\345\272\217/README.md" index 2cf786ba9d063..b1825d242918d 100644 --- "a/lcof2/\345\211\221\346\214\207 Offer II 077. \351\223\276\350\241\250\346\216\222\345\272\217/README.md" +++ "b/lcof2/\345\211\221\346\214\207 Offer II 077. \351\223\276\350\241\250\346\216\222\345\272\217/README.md" @@ -377,6 +377,64 @@ public class Solution { } ``` +#### Swift + +```swift + +/** 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 sortList(_ head: ListNode?) -> ListNode? { + guard let head = head, head.next != nil else { + return head + } + + var slow: ListNode? = head + var fast: ListNode? = head.next + + while fast != nil && fast?.next != nil { + slow = slow?.next + fast = fast?.next?.next + } + + let mid = slow?.next + slow?.next = nil + + let left = sortList(head) + let right = sortList(mid) + + return merge(left, right) + } + + private func merge(_ l1: ListNode?, _ l2: ListNode?) -> ListNode? { + let dummy = ListNode() + var cur = dummy + var l1 = l1, l2 = l2 + + while let node1 = l1, let node2 = l2 { + if node1.val <= node2.val { + cur.next = node1 + l1 = node1.next + } else { + cur.next = node2 + l2 = node2.next + } + cur = cur.next! + } + + cur.next = l1 ?? l2 + return dummy.next + } +} +``` + diff --git "a/lcof2/\345\211\221\346\214\207 Offer II 077. \351\223\276\350\241\250\346\216\222\345\272\217/Solution.swift" "b/lcof2/\345\211\221\346\214\207 Offer II 077. \351\223\276\350\241\250\346\216\222\345\272\217/Solution.swift" new file mode 100644 index 0000000000000..9ab81ab9303af --- /dev/null +++ "b/lcof2/\345\211\221\346\214\207 Offer II 077. \351\223\276\350\241\250\346\216\222\345\272\217/Solution.swift" @@ -0,0 +1,53 @@ + +/** 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 sortList(_ head: ListNode?) -> ListNode? { + guard let head = head, head.next != nil else { + return head + } + + var slow: ListNode? = head + var fast: ListNode? = head.next + + while fast != nil && fast?.next != nil { + slow = slow?.next + fast = fast?.next?.next + } + + let mid = slow?.next + slow?.next = nil + + let left = sortList(head) + let right = sortList(mid) + + return merge(left, right) + } + + private func merge(_ l1: ListNode?, _ l2: ListNode?) -> ListNode? { + let dummy = ListNode() + var cur = dummy + var l1 = l1, l2 = l2 + + while let node1 = l1, let node2 = l2 { + if node1.val <= node2.val { + cur.next = node1 + l1 = node1.next + } else { + cur.next = node2 + l2 = node2.next + } + cur = cur.next! + } + + cur.next = l1 ?? l2 + return dummy.next + } +} \ No newline at end of file