對鏈表進行插入排序


插入排序的動畫演示如上。從第一個元素開始,該鏈表能夠被認爲已經部分排序(用黑色表示)。每次迭代時,從輸入數據中移除一個元素(用紅色表示),並原地將其插入到已排好序的鏈表中html



解題思路

插入排序算法想必你們都不陌生了,若是不瞭解的話來看看下面這篇博客吧java

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