1. 程式人生 > 實用技巧 >147 對連結串列進行插入排序

147 對連結串列進行插入排序

插入排序演算法:插入排序是迭代的,每次只移動一個元素,直到所有元素可以形成一個有序的輸出列表。每次迭代中,插入排序只從輸入資料中移除一個待排序的元素,找到它在序列中適當的位置,並將其插入。重複直到所有輸入資料插入完為止。

示例 1

輸入: 4->2->1->3
輸出: 1->2->3->4

示例 2

輸入: -1->5->3->4->0
輸出: -1->0->3->4->5
class ListNode {
    int val;
    ListNode next;
    ListNode(int x) {
        val = x;
    }
}

//遍歷節點,將值較小的節點從頭遍歷直到找到合適的位置。
class Solution {
    public static ListNode insertionSortList(ListNode head) {
        if (head == null){
            return head;
        }
        ListNode dummy = new ListNode(0);//處理連結串列時,在頭部新增空節點能避免對第一個節點做特殊處理。
        dummy.next = head;
        ListNode checkNode = head;
        ListNode insertNode = dummy;
        ListNode temp;
        while (checkNode.next!=null){
            if (checkNode.val > checkNode.next.val){
                temp = checkNode.next;
                checkNode.next = checkNode.next.next;
                while (insertNode.next!=null){
                    if (insertNode.next.val<temp.val){
                        insertNode = insertNode.next;
                    }else{
                        temp.next = insertNode.next;
                        insertNode.next = temp;
                        insertNode = dummy;
                        break;
                    }
                }
            }else{
                checkNode = checkNode.next;
            }
        }
        return dummy.next;
    }
}

使用了雙重迴圈,最糟糕的情況是倒序的連結串列,時間複雜度為 \(O(N^2)\),只使用了常數個變數,空間複雜度為 \(O(1)\)