[LintCode] Insertion Sort List

Problem

Sort a linked list using insertion sort.node

Example

Given 1->3->2->0->null, return 0->1->2->3->null.算法

Note

插入排序【維基百科】數組

通常來講,插入排序都採用in-place在數組上實現。具體算法描述以下:指針

  1. 從第一個元素開始,該元素能夠認爲已經被排序code

  2. 取出下一個元素,在已經排序的元素序列中從後向前掃描排序

  3. 若是該元素(已排序)大於新元素,將該元素移到下一位置io

  4. 重複步驟3,直到找到已排序的元素小於或者等於新元素的位置class

  5. 將新元素插入到該位置後List

  6. 重複步驟2~5循環

關於插入排序,我所知道的就是從頭部開始,將每一個數放到合適的位置。在放這個數以前,這個數的目標位置和原始位置之間的數都要先進行後移。然而這是一個in-place的操做,而對於鏈表而言,咱們只要作一個空鏈表,而後不斷加入原鏈表中的最小元素便可。
cur是原鏈表head的指針,不斷向後掃描;node是空鏈表dummy的指針,用node.nextcur所指向的結點進行比較,一旦發現排列好的新鏈表中有大於cur的結點,就把cur放在node.next,而後進行下一輪循環:cur.next做爲原鏈表新的curnode返回新鏈表起點dummy。最後,當cur = null,即遍歷完整個原鏈表以後,新鏈表排序完成。返回dummy.next便可。

Solution

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;
    }
}
相關文章
相關標籤/搜索