143. Reorder List

Medium
You are given the head of a singly linked-list. The list can be represented as:
L0 → L1 → … → Ln - 1 → Ln
Reorder the list to be on the following form:
L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …
You may not modify the values in the list's nodes. Only nodes themselves may be changed.
Example 1:
​
​
Input: head = [1,2,3,4]
Output:
[1,4,2,3]
Example 2:
​
​
Input: head = [1,2,3,4,5]
Output:
[1,5,2,4,3]
Constraints:
  • The number of nodes in the list is in the range [1, 5 * 104].
  • 1 <= Node.val <= 1000

解題

/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func reorderList(head *ListNode) {
fast, slow, prev := head, head, head
stack := make([]*ListNode, 0)
​
for fast!= nil && fast.Next != nil {
fast = fast.Next.Next
prev = slow
slow = slow.Next
}
​
for slow != nil {
stack = append(stack, slow)
slow = slow.Next
}
prev.Next = nil
​
h := head
for h!= nil && len(stack) > 0 {
temp := h.Next
h.Next = stack[len(stack) - 1]
stack[len(stack) - 1].Next = temp
h = temp
​
if h == nil {
h = stack[len(stack) - 1]
}
​
stack = stack[:len(stack) - 1]
}
}
​
​