插入排序的動畫演示如上。從第一個元素開始,該鏈表能夠被認爲已經部分排序(用黑色表示)。每次迭代時,從輸入數據中移除一個元素(用紅色表示),並原地將其插入到已排好序的鏈表中html
插入排序算法想必你們都不陌生了,若是不瞭解的話來看看下面這篇博客吧java
難點在於這是個單向鏈表,不能向數組同樣直接從後往前遍歷,所以咱們每找到一個不符合排序規則的元素,都必須從頭再遍歷,找到合適的插入點,而這又考察到有關鏈表的操做數組
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode insertionSortList(ListNode head) { if(head == null) { return head; } ListNode dummyHead = new ListNode(-1); dummyHead.next = head; ListNode lastNode = head, curNode = head.next; while(curNode != null) { if(lastNode.val <= curNode.val) { lastNode = lastNode.next; } else { ListNode preNode = dummyHead; while(preNode.next.val <= curNode.val) { preNode = preNode.next; } lastNode.next = curNode.next; curNode.next = preNode.next; preNode.next = curNode; } curNode = lastNode.next; } return dummyHead.next; } }