package main
import . "nc_tools"
/*
 * type ListNode struct{
 *   Val int
 *   Next *ListNode
 * }
 */

/**
 * 
 * @param head ListNode类 the head node
 * @return ListNode类
*/
/*
*
归并排序
step 1:首先判断链表为空或者只有一个元素,直接就是有序的。
step 2:准备三个指针,快指针right每次走两步,慢指针mid每次走一步,前序指针left每次跟在mid前一个位置。
三个指针遍历链表,当快指针到达链表尾部的时候,慢指针mid刚好走了链表的一半,正好是中间位置。
step 3:从left位置将链表断开,刚好分成两个子问题开始递归。
step 4:将子问题得到的链表合并,参考合并两个有序链表。
*/
func sortInList(head *ListNode) *ListNode {
	if head == nil || head.Next == nil {
		return head
	}
	left := head
	mid := head.Next
	right := head.Next.Next
	for right != nil && right.Next != nil {
		left = left.Next
		mid = mid.Next
		right = right.Next.Next
	}
	// 断开
	left.Next = nil
	return merge(sortInList(head), sortInList(mid))
}

func merge(list1, list2 *ListNode) *ListNode {
	res := &ListNode{Val: 0}
	tmp := res
	for list1 != nil && list2 != nil {
		var newNode *ListNode
		if list1.Val < list2.Val {
			newNode = &ListNode{Val: list1.Val}
			list1 = list1.Next
		} else {
			newNode = &ListNode{Val: list2.Val}
			list2 = list2.Next
		}
		tmp.Next = newNode
		tmp = tmp.Next
	}
	if list1 != nil {
		tmp.Next = list1
	}
	if list2 != nil {
		tmp.Next = list2
	}
	return res.Next
}