147 对链表进行插入排序

插入排序算法:插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。重复直到所有输入数据插入完为止。

示例 1

输入: 4->2->1->3
输出: 1->2->3->4

示例 2

输入: -1->5->3->4->0
输出: -1->0->3->4->5
class ListNode {
    int val;
    ListNode next;
    ListNode(int x) {
        val = x;
    }
}

//遍历节点,将值较小的节点从头遍历直到找到合适的位置。
class Solution {
    public static ListNode insertionSortList(ListNode head) {
        if (head == null){
            return head;
        }
        ListNode dummy = new ListNode(0);//处理链表时,在头部添加空节点能避免对第一个节点做特殊处理。
        dummy.next = head;
        ListNode checkNode = head;
        ListNode insertNode = dummy;
        ListNode temp;
        while (checkNode.next!=null){
            if (checkNode.val > checkNode.next.val){
                temp = checkNode.next;
                checkNode.next = checkNode.next.next;
                while (insertNode.next!=null){
                    if (insertNode.next.val<temp.val){
                        insertNode = insertNode.next;
                    }else{
                        temp.next = insertNode.next;
                        insertNode.next = temp;
                        insertNode = dummy;
                        break;
                    }
                }
            }else{
                checkNode = checkNode.next;
            }
        }
        return dummy.next;
    }
}

使用了双重循环,最糟糕的情况是倒序的链表,时间复杂度为 \(O(N^2)\),只使用了常数个变量,空间复杂度为 \(O(1)\)。

上一篇:[LeetCode] 147. Insertion Sort List


下一篇:每日一题20201120(147. 对链表进行插入排序)