|
@@ -0,0 +1,73 @@
|
|
|
+package main
|
|
|
+
|
|
|
+/**
|
|
|
+ * Definition for singly-linked list.
|
|
|
+ * type ListNode struct {
|
|
|
+ * Val int
|
|
|
+ * Next *ListNode
|
|
|
+ * }
|
|
|
+ */
|
|
|
+func reorderListOld(head *ListNode) {
|
|
|
+ // Given a singly linked list L: L0→L1→…→Ln-1→Ln,
|
|
|
+ // reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…
|
|
|
+ if head == nil || head.Next == nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ stack := make([]*ListNode, 0)
|
|
|
+ beg := head
|
|
|
+ length := 0
|
|
|
+ for beg != nil {
|
|
|
+ stack = append(stack, beg)
|
|
|
+ beg = beg.Next
|
|
|
+ length++
|
|
|
+ }
|
|
|
+ beg = head
|
|
|
+ for i := 0; i < length/2; i++ {
|
|
|
+ tmp := beg.Next
|
|
|
+ beg.Next = stack[length-i-1]
|
|
|
+ beg.Next.Next = tmp
|
|
|
+ beg = tmp
|
|
|
+ }
|
|
|
+ beg.Next = nil
|
|
|
+}
|
|
|
+
|
|
|
+func reorderList(head *ListNode) {
|
|
|
+ if head == nil || head.Next == nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ slow, fast := head, head
|
|
|
+ for fast != nil && fast.Next != nil {
|
|
|
+ // Find the middle of list
|
|
|
+ slow = slow.Next
|
|
|
+ fast = fast.Next.Next
|
|
|
+ }
|
|
|
+ // Reverse the 2nd part
|
|
|
+ var prev *ListNode
|
|
|
+ for slow.Next != nil {
|
|
|
+ tmp := slow.Next
|
|
|
+ slow.Next = prev
|
|
|
+ prev = slow
|
|
|
+ slow = tmp
|
|
|
+ }
|
|
|
+ slow.Next = prev
|
|
|
+ // Merge the 1st part and the 2nd part
|
|
|
+ left, right := head, slow
|
|
|
+ for left != nil && right.Next != nil {
|
|
|
+ tmpL, tmpR := left.Next, right.Next
|
|
|
+ left.Next = right
|
|
|
+ right.Next = tmpL
|
|
|
+ left, right = tmpL, tmpR
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// func main() {
|
|
|
+// n5 := ListNode{5, nil}
|
|
|
+// n4 := ListNode{4, &n5}
|
|
|
+// // n4 := ListNode{4, nil}
|
|
|
+// n3 := ListNode{3, &n4}
|
|
|
+// n2 := ListNode{2, &n3}
|
|
|
+// n1 := ListNode{1, &n2}
|
|
|
+// printList(&n1)
|
|
|
+// reorderList(&n1)
|
|
|
+// printList(&n1)
|
|
|
+// }
|