1. 程式人生 > 實用技巧 >【HDU-5238】Calculator(中國剩餘定理CRT+線段樹亂搞)

【HDU-5238】Calculator(中國剩餘定理CRT+線段樹亂搞)


插入排序的動畫演示如上。從第一個元素開始,該連結串列可以被認為已經部分排序(用黑色表示)。每次迭代時,從輸入資料中移除一個元素(用紅色表示),並原地將其插入到已排好序的連結串列中



解題思路

插入排序演算法想必大家都不陌生了,如果不瞭解的話來看看下面這篇部落格吧

用 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;
    }
}