[Swift]LeetCode143. 重排链表 | Reorder List
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/9968081.html
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
Given a singly linked list L: L0→L1→…→Ln-1→Ln,
reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…
You may not modify the values in the list's nodes, only nodes itself may be changed.
Example 1:
Given 1->2->3->4, reorder it to 1->4->2->3.
Example 2:
Given 1->2->3->4->5, reorder it to 1->5->2->4->3.
给定一个单链表 L:L0→L1→…→Ln-1→Ln ,
将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 1:
给定链表 1->2->3->4, 重新排列为 1->4->2->3.
示例 2:
给定链表 1->2->3->4->5, 重新排列为 1->5->2->4->3.
72ms
1 /** 2 * Definition for singly-linked list. 3 * public class ListNode { 4 * public var val: Int 5 * public var next: ListNode? 6 * public init(_ val: Int) { 7 * self.val = val 8 * self.next = nil 9 * } 10 * } 11 */ 12 class Solution { 13 func reorderList(_ head: ListNode?) { 14 var arr = [ListNode]() 15 var cur = head 16 while cur != nil { 17 arr.append(cur!) 18 cur = cur!.next 19 } 20 var i = 0 21 var j = arr.count - 1 22 23 cur = nil 24 while i <= j { 25 if i == j { 26 cur?.next = arr[j] 27 cur = arr[j] 28 break 29 } 30 31 cur?.next = arr[i] 32 arr[i].next = arr[j] 33 cur = arr[j] 34 35 i += 1 36 j -= 1 37 } 38 cur?.next = nil 39 } 40 }
80ms
1 /** 2 * Definition for singly-linked list. 3 * public class ListNode { 4 * public var val: Int 5 * public var next: ListNode? 6 * public init(_ val: Int) { 7 * self.val = val 8 * self.next = nil 9 * } 10 * } 11 */ 12 class Solution { 13 func reorderList(_ head: ListNode?) -> ListNode? { 14 guard let head = head else { return nil } 15 var slow: ListNode? = head 16 var fast: ListNode? = head 17 while fast?.next?.next != nil { 18 fast = fast?.next?.next 19 slow = slow?.next 20 } 21 let next = reverseList(slow?.next) 22 slow?.next = nil 23 slow = head 24 fast = next 25 var curr: ListNode? = nil 26 while slow != nil { 27 curr?.next = slow 28 curr = fast 29 let tmp = slow?.next 30 slow?.next = fast 31 slow = tmp 32 fast = fast?.next 33 } 34 return head 35 } 36 37 func reverseList(_ head: ListNode?) -> ListNode? { 38 guard let head = head else { return nil } 39 var curr: ListNode? = head 40 var prev: ListNode? = nil 41 while curr != nil { 42 let tmp = curr?.next 43 curr?.next = prev 44 prev = curr 45 curr = tmp 46 } 47 return prev 48 } 49 }
84ms
1 /** 2 * Definition for singly-linked list. 3 * public class ListNode { 4 * public var val: Int 5 * public var next: ListNode? 6 * public init(_ val: Int) { 7 * self.val = val 8 * self.next = nil 9 * } 10 * } 11 */ 12 class Solution { 13 func reorderList(_ head: ListNode?) { 14 if head?.next?.next == nil { return } 15 16 var slow: ListNode? = head 17 var quick: ListNode? = head 18 19 while (true) { 20 if quick?.next?.next == nil { break } 21 slow = slow?.next 22 quick = quick?.next?.next 23 } 24 25 // 1 // 1, 2 26 // if slow?.val == quick?.val { return } 27 28 // 1,2,3 29 var second: ListNode = slow!.next! 30 slow!.next = nil 31 var first: ListNode = head! 32 33 34 revNode(&second) 35 36 // debug(first) 37 // debug(second) 38 let resHead = mergNode(first, second) 39 // debug(resHead) 40 41 head?.next = resHead.next 42 } 43 44 func revNode(_ head: inout ListNode) { 45 var prev: ListNode? 46 var cur: ListNode? = head 47 48 while (cur != nil) { 49 let temp: ListNode? = cur?.next 50 cur?.next = prev 51 prev = cur 52 cur = temp 53 } 54 55 head = prev! 56 } 57 58 func mergNode(_ n1: ListNode, _ n2: ListNode) -> ListNode { 59 var cur1: ListNode? = n1 60 var cur2: ListNode? = n2 61 62 let head: ListNode = ListNode(0) 63 var cur: ListNode? = head 64 65 var m1 = true 66 while (true) { 67 if m1 { 68 cur?.next = cur1 69 cur = cur?.next 70 cur1 = cur1?.next 71 } else { 72 cur?.next = cur2 73 cur = cur?.next 74 cur2 = cur2?.next 75 } 76 m1 = !m1 77 if cur1 == nil && cur2 == nil { break } 78 } 79 80 return head.next! 81 } 82 83 func debug(_ node: ListNode?) { 84 var temp: ListNode? = node 85 var res = "" 86 while temp != nil { 87 res += String(temp!.val) + " " 88 temp = temp!.next 89 } 90 print(res) 91 } 92 }
92ms
1 /** 2 * Definition for singly-linked list. 3 * public class ListNode { 4 * public var val: Int 5 * public var next: ListNode? 6 * public init(_ val: Int) { 7 * self.val = val 8 * self.next = nil 9 * } 10 * } 11 */ 12 class Solution { 13 func reorderList(_ head: ListNode?) { 14 if head == nil || head?.next == nil { 15 return 16 } 17 18 var p1: ListNode? = head 19 var p2: ListNode? = head 20 while p2?.next != nil && p2?.next?.next != nil { 21 p1 = p1?.next 22 p2 = p2?.next?.next 23 } 24 25 //reverse the 2nd half 26 let preMiddle: ListNode? = p1 27 let preCur: ListNode? = p1?.next 28 while preCur?.next != nil { 29 let cur = preCur?.next 30 preCur?.next = cur?.next 31 cur?.next = preMiddle?.next 32 preMiddle?.next = cur 33 } 34 35 // reconstruct the link 36 p1 = head 37 p2 = preMiddle?.next 38 while p1 !== preMiddle { 39 preMiddle?.next = p2?.next 40 p2?.next = p1?.next 41 p1?.next = p2 42 p1 = p2?.next 43 p2 = preMiddle?.next 44 } 45 } 46 }
104ms
1 /** 2 * Definition for singly-linked list. 3 * public class ListNode { 4 * public var val: Int 5 * public var next: ListNode? 6 * public init(_ val: Int) { 7 * self.val = val 8 * self.next = nil 9 * } 10 * } 11 */ 12 class Solution { 13 func reorderList(_ head: ListNode?) { 14 guard let head = head else { 15 return 16 } 17 18 var next: ListNode? = head 19 var reverseNodes: [ListNode] = [] 20 while next != nil { 21 reverseNodes.append(next!) 22 next = next?.next 23 } 24 25 next = head 26 var index = reverseNodes.count - 1 27 while index >= reverseNodes.count / 2 { 28 let temp = next?.next 29 next?.next = reverseNodes[index] 30 reverseNodes[index].next = temp 31 next = temp 32 33 index -= 1 34 } 35 36 reverseNodes[index + 1].next = nil 37 } 38 }
108ms
1 /** 2 * Definition for singly-linked list. 3 * public class ListNode { 4 * public var val: Int 5 * public var next: ListNode? 6 * public init(_ val: Int) { 7 * self.val = val 8 * self.next = nil 9 * } 10 * } 11 */ 12 class Solution { 13 func reorderList(_ head: ListNode?) { 14 guard let head = head else { 15 return 16 } 17 18 var prev: ListNode? = head 19 var post: ListNode? = head 20 21 _split(&prev, &post) 22 prev = head 23 24 post = _reverse(&post) 25 26 _merge(&prev, &post) 27 } 28 29 private func _split(_ prev: inout ListNode?, _ post: inout ListNode?) { 30 while post != nil && post!.next != nil { 31 prev = prev!.next 32 post = post!.next!.next 33 } 34 35 post = prev!.next 36 prev!.next = nil 37 } 38 39 private func _reverse(_ head:inout ListNode?) -> ListNode? { 40 var prev = head 41 var temp: ListNode? 42 43 while prev != nil { 44 let post = prev!.next 45 46 prev!.next = temp 47 48 temp = prev 49 prev = post 50 } 51 52 return temp 53 } 54 55 private func _merge(_ prev:inout ListNode?, _ post:inout ListNode?) { 56 while prev != nil && post != nil{ 57 let preNext = prev!.next 58 let posNext = post!.next 59 60 prev!.next = post 61 post!.next = preNext 62 63 prev = preNext 64 post = posNext 65 } 66 } 67 }