Sort a linked list using insertion sort.node
Given 1->3->2->0->null, return 0->1->2->3->null.算法
插入排序【維基百科】數組
通常來講,插入排序都採用in-place在數組上實現。具體算法描述以下:指針
從第一個元素開始,該元素能夠認爲已經被排序code
取出下一個元素,在已經排序的元素序列中從後向前掃描排序
若是該元素(已排序)大於新元素,將該元素移到下一位置io
重複步驟3,直到找到已排序的元素小於或者等於新元素的位置class
將新元素插入到該位置後List
重複步驟2~5循環
關於插入排序,我所知道的就是從頭部開始,將每一個數放到合適的位置。在放這個數以前,這個數的目標位置和原始位置之間的數都要先進行後移。然而這是一個in-place的操做,而對於鏈表而言,咱們只要作一個空鏈表,而後不斷加入原鏈表中的最小元素便可。cur
是原鏈表head
的指針,不斷向後掃描;node
是空鏈表dummy
的指針,用node.next
與cur
所指向的結點進行比較,一旦發現排列好的新鏈表中有大於cur
的結點,就把cur
放在node.next
,而後進行下一輪循環:cur.next
做爲原鏈表新的cur
,node
返回新鏈表起點dummy
。最後,當cur = null
,即遍歷完整個原鏈表以後,新鏈表排序完成。返回dummy.next
便可。
public class Solution { public ListNode insertionSortList(ListNode head) { ListNode dummy = new ListNode(0); ListNode cur = head; while (cur != null) { ListNode node = dummy; while (node.next != null && node.next.val < cur.val) node = node.next; ListNode temp = cur.next; cur.next = node.next; node.next = cur; cur = temp; } return dummy.next; } }