對連結清單進行插入排序。

插入排序的動畫示範如上。從第一個元素開始,該連結清單可以被認為已經部分排序(用黑色表示)。
每次疊代時,從輸入資料中移除一個元素(用紅色表示),并原地将其插入到已排好序的連結清單中。
插入排序算法:
- 插入排序是疊代的,每次隻移動一個元素,直到所有元素可以形成一個有序的輸出清單。
- 每次疊代中,插入排序隻從輸入資料中移除一個待排序的元素,找到它在序列中适當的位置,并将其插入。
- 重複直到所有輸入資料插入完為止。
示例 1:
輸入: 4->2->1->3
輸出: 1->2->3->4
思路:
先将連結清單第一個元素斷開聯系,預設一個元素是已經排好序的,在将剩餘元素标記為未排序的連結清單,之後每次循環未排序連結清單中每一個元素, 先和排序連結清單的頭比較,如果比頭下則直接插入到頭前面,如果比頭大則依次周遊排序數組中每一個元素,知道找到比目前元素大的元素,然後将其插入到這個元素前面,如果一直周遊到最後都沒有比他大的則直接插入到最後。代碼如下:
/**
* Definition for singly-linked list.
* public class ListNode {
* public int val;
* public ListNode next;
* public ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode InsertionSortList(ListNode head) {
if(head == null || head.next == null) return head;
//未排序的連結清單,預設第一個元素是排好序的
ListNode noFinish = head.next;
head.next = null; //排好序的連結清單
ListNode current,finish; //current是未排序連結清單每一個值 finish是排好序的連結清單
while(noFinish != null){
current = noFinish;
noFinish = noFinish.next;
current.next = null; //斷開聯系,取出目前未排序的節點
if(head.val > current.val){ //和排序連結清單中第一個元素比較
current.next = head;
head = current;
continue;
}
finish = head;
while(finish.next != null){ //和排序連結清單後面每一個元素比較
if(finish.next.val > current.val){
current.next = finish.next;
finish.next = current;
break;
}
finish = finish.next;
}
if(finish.next == null){ //直接加入到最後一個元素
finish.next = current;
}
}
return head;
}
}