Insertion Sort List

medium linked list sorting

Problem

Sort a singly linked list using insertion sort and return the sorted head.

Inputhead = [4, 2, 1, 3]
Output[1, 2, 3, 4]
Maintain a sorted prefix behind a dummy head. For each input node, walk the prefix to its insertion spot and splice in.

def insertion_sort_list(head):
    dummy = ListNode(0)
    cur = head
    while cur:
        nxt = cur.next
        p = dummy
        while p.next and p.next.val < cur.val:
            p = p.next
        cur.next = p.next
        p.next = cur
        cur = nxt
    return dummy.next
function insertionSortList(head) {
  const dummy = { val: 0, next: null };
  let cur = head;
  while (cur) {
    const nxt = cur.next;
    let p = dummy;
    while (p.next && p.next.val < cur.val) p = p.next;
    cur.next = p.next;
    p.next = cur;
    cur = nxt;
  }
  return dummy.next;
}
class Solution {
    public ListNode insertionSortList(ListNode head) {
        ListNode dummy = new ListNode(0), cur = head;
        while (cur != null) {
            ListNode nxt = cur.next, p = dummy;
            while (p.next != null && p.next.val < cur.val) p = p.next;
            cur.next = p.next;
            p.next = cur;
            cur = nxt;
        }
        return dummy.next;
    }
}
ListNode* insertionSortList(ListNode* head) {
    ListNode dummy(0), *cur = head;
    while (cur) {
        ListNode *nxt = cur->next, *p = &dummy;
        while (p->next && p->next->val < cur->val) p = p->next;
        cur->next = p->next;
        p->next = cur;
        cur = nxt;
    }
    return dummy.next;
}
Time: O(n²) Space: O(1)