147. 对链表进行插入排序

147. 对链表进行插入排序

思路:

  与数组插入排序的思路相同,都是先有一个有序序列,然后拿着待插入元素,在有序序列中找到正确的位置;

  链表有序序列的初始化方式就是,先定义一个哨兵dummyNode,然后让head节点成为第一个有序的序列的元素,维护一个lastSortNode保存有序序列的最后一个元素。

  其实就相当于从第一个元素开始每次拿有序序列的后边一个元素,放到正确的位置上,最后让所有的链表都有序了。

https://leetcode-cn.com/problems/insertion-sort-list/solution/dui-lian-biao-jin-xing-cha-ru-pai-xu-by-leetcode-s/

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode insertionSortList(ListNode head) {
        ListNode dummyHead = new ListNode(0);
        dummyHead.next = head;
        ListNode lastSorted = head;
        ListNode cur = head.next;
        while (cur != null) {
            if (lastSorted.val < cur.val) {
                lastSorted = lastSorted.next;
            } else {
                // 从前往后找到合适的位置,将cur元素插入到链表中
                ListNode pre = dummyHead;
                while (cur.val > pre.next.val) {
                    pre = pre.next;
                }
                // 将cur从原来的链表中删除
                lastSorted.next = cur.next;
                // 将cur添加到新排序链表中
                cur.next = pre.next;
                pre.next = cur;
            }
            cur = lastSorted.next;
        }
        return dummyHead.next;
    }
}

 

。。

posted @ 2021-12-28 21:31  guoyu1  阅读(31)  评论(0编辑  收藏  举报