package main func conquerAndSort(head *ListNode, end *ListNode) *ListNode { if head == nil || head == end || head.Next == nil { return head } if head.Next == end { if end != nil { if head.Val > end.Val { head.Val, end.Val = end.Val, head.Val } } return head } if head.Next.Next == end { if head.Val > head.Next.Val { head.Next.Val, head.Val = head.Val, head.Next.Val } return head } slow, fast := head, head for fast.Next != nil && fast.Next.Next != nil { slow = slow.Next fast = fast.Next.Next } lastSlow := slow slow = slow.Next lastSlow.Next = nil a := conquerAndSort(head, nil) b := conquerAndSort(slow, end) if a.Val > b.Val { a, b = b, a } // a Val < b Val head = a cur := a a = a.Next for a != nil && b != nil { if a.Val > b.Val { cur.Next = b b = b.Next } else { cur.Next = a a = a.Next } cur = cur.Next } if a == nil { cur.Next = b } else { cur.Next = a } return head } func sortList(head *ListNode) *ListNode { return conquerAndSort(head, nil) } func main() { arr := []int{-1, 5, 3, 4, 0} checkLink(sortList(makeLink(arr))) }