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 }