147 對連結串列進行插入排序
阿新 • • 發佈:2020-11-20
插入排序演算法:插入排序是迭代的,每次只移動一個元素,直到所有元素可以形成一個有序的輸出列表。每次迭代中,插入排序只從輸入資料中移除一個待排序的元素,找到它在序列中適當的位置,並將其插入。重複直到所有輸入資料插入完為止。
示例 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)\)。