Using Iteration O(N), O(1)

public ListNode insertionSortList(ListNode head) {
	if( head == null ){
		return head;
	}
	
	ListNode helper = new ListNode(0); //new starter of the sorted list
	ListNode cur = head; //the node will be inserted
	ListNode pre = helper; //insert node between pre and pre.next
	ListNode next = null; //the next node will be inserted
	//not the end of input list
	while( cur != null ){
		next = cur.next;
		//find the right place to insert
		while( pre.next != null && pre.next.val < cur.val ){
			pre = pre.next;
		}
		//insert between pre and pre.next
		cur.next = pre.next;
		pre.next = cur;
		pre = helper;
		cur = next;
	}
	
	return helper.next;
}

improved

public ListNode insertionSortList(ListNode head) {
     ListNode dummy = new ListNode(0);
     ListNode prev = dummy;

    while (head != null) {
        ListNode temp = head.next;
        
        /* Before insert, the prev is at the last node of the sorted list.
           Only the last node's value is larger than the current inserting node 
           should we move the temp back to the head*/
        if (prev.val >= head.val) prev = dummy;

        while (prev.next != null && prev.next.val < head.val) {
            prev = prev.next;
        }
        
        head.next = prev.next;
        prev.next = head;
        // prev = dummy; // Don't set prev to the head of the list after insert
        head = temp;
    }
    return dummy.next;
}

Last updated