Mental Model
Break the list into smaller parts, sort each part, then join them back in order.
Analogy: Like sorting a deck of cards by splitting it into halves, sorting each half, then merging them back neatly.
head -> 4 -> 2 -> 1 -> 3 -> null
head -> 4 -> 2 -> 1 -> 3 -> null
4 -> 2 -> null and 1 -> 3 -> null
2 -> 4 -> null
1 -> 3 -> null
1 -> 2 -> 3 -> 4 -> null
1 -> 2 -> 3 -> 4 -> null
package main import "fmt" type ListNode struct { Val int Next *ListNode } func mergeSort(head *ListNode) *ListNode { if head == nil || head.Next == nil { return head // base case: empty or single node list } // find middle using slow and fast pointers slow, fast := head, head.Next for fast != nil && fast.Next != nil { slow = slow.Next fast = fast.Next.Next } mid := slow.Next slow.Next = nil // split list into two halves left := mergeSort(head) // sort left half right := mergeSort(mid) // sort right half return merge(left, right) // merge sorted halves } func merge(l1, l2 *ListNode) *ListNode { dummy := &ListNode{} curr := dummy for l1 != nil && l2 != nil { if l1.Val < l2.Val { curr.Next = l1 l1 = l1.Next } else { curr.Next = l2 l2 = l2.Next } curr = curr.Next } if l1 != nil { curr.Next = l1 } else { curr.Next = l2 } return dummy.Next } func printList(head *ListNode) { for head != nil { fmt.Printf("%d", head.Val) if head.Next != nil { fmt.Printf(" -> ") } head = head.Next } fmt.Println(" -> null") } func main() { // create list 4 -> 2 -> 1 -> 3 -> null head := &ListNode{Val: 4} head.Next = &ListNode{Val: 2} head.Next.Next = &ListNode{Val: 1} head.Next.Next.Next = &ListNode{Val: 3} fmt.Print("Original list: ") printList(head) sortedHead := mergeSort(head) fmt.Print("Sorted list: ") printList(sortedHead) }
if head == nil || head.Next == nil {slow, fast := head, head.Nextfor fast != nil && fast.Next != nil {mid := slow.Next
slow.Next = nilleft := mergeSort(head)
right := mergeSort(mid)return merge(left, right)for l1 != nil && l2 != nil {if l1 != nil {
curr.Next = l1
} else {
curr.Next = l2
}if head == nil || head.Next == nil {if head == nil || head.Next == nil {for l1 != nil && l2 != nil {func mergeSort(head *Node) *Node {
if head == nil || head.next == nil {
return head
}
mid := getMiddle(head)
left := head
right := mid.next
mid.next = nil
left = mergeSort(left)
right = mergeSort(right)
return merge(left, right)
}
func getMiddle(head *Node) *Node {
slow, fast := head, head.next
for fast != nil && fast.next != nil {
slow = slow.next
fast = fast.next.next
}
return slow
}Pass the test and this pattern moves unknown