package main /** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */ func sortList(head *ListNode) *ListNode { if head == nil || head.Next == nil { return head } // !!Must split []int{1, 2} into 1 & 2 slow, fast := head, head.Next // So, fast = head.Next for fast != nil && fast.Next != nil { slow = slow.Next fast = fast.Next.Next } left := head right := slow.Next slow.Next = nil // Unlink in the middle left = sortList(left) right = sortList(right) return mergeList(left, right) } func mergeList(l1, l2 *ListNode) *ListNode { dummy := &ListNode{} prev := dummy for l1 != nil && l2 != nil { if l1.Val < l2.Val { prev.Next = l1 l1 = l1.Next } else { prev.Next = l2 l2 = l2.Next } prev = prev.Next } if l1 != nil { prev.Next = l1 } else { prev.Next = l2 } return dummy.Next } // func main() { // l1 := toLinkedList([]int{ // 2, 7, 4, 2, 8, 54, 3, 2}) // printList(sortList(l1)) // }