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 @   guoyu1  阅读(34)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示