對鏈表進行插入排序。

插入排序的動畫演示如上。從第一個元素開始,該鏈表可以被認為已經部分排序(用黑色表示)。
每次迭代時,從輸入數據中移除一個元素(用紅色表示),並原地將其插入到已排好序的鏈表中。
插入排序算法:
插入排序是迭代的,每次只移動一個元素,直到所有元素可以形成一個有序的輸出列表。
每次迭代中,插入排序只從輸入數據中移除一個待排序的元素,找到它在序列中適當的位置,並將其插入。
重復直到所有輸入數據插入完為止。
示例 1:
輸入: 4->2->1->3
輸出: 1->2->3->4
解法1:
public static ListNode insertionSortList2(ListNode head) { /*定義一個啞節點*/ ListNode dumb = new ListNode(0); /*啞節點的下一個指向head*/ dumb.next = head; /*定義一個當前節點指針*/ ListNode cur = head; /*當當前節點和它的下一個節點不為null時繼續循環*/ while (cur != null && cur.next != null) { /*依次把當前節點與它的下一個節點進行對比,如果當前節點的值比當前節點的下一個節點的值小,則當前節點向后移動一位,否則進行下一步*/ if (cur.val < cur.next.val) { cur = cur.next; continue; } /*定義一個插入節點,指向啞節點*/ ListNode insert = dumb; /*由於啞節點本身不參與,所以從它的下一個節點開始依次與當前節點的下一個節點開始比較,直到啞節點的下一個節點比當前節點的下一個節點的值大*/ while (insert.next.val < cur.next.val) { insert = insert.next; } /*定義一個臨時節點指向當前節點的下一個節點,然后把節點插入前面的節點中*/ ListNode temp = cur.next; cur.next = temp.next; temp.next = insert.next; insert.next = temp; } return dumb.next; }
public static class ListNode { private int val; private ListNode next; public ListNode(int val) { this.val = val; } }
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/insertion-sort-list
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
