|  | @@ -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)
 | 
	
		
			
				|  |  | +// }
 |