LeetCode-对链表进行插入排序

该篇博客详细分析了一种链表排序算法,通过插入排序的方法,逐步调整链表节点顺序。代码实现中,首先创建一个虚拟头节点,然后遍历链表,寻找合适位置插入节点,保证链表有序。时间复杂度为O(n^2),空间复杂度为O(1)。整个过程无需移动元素,只需修改指针。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目内容

示例分析

代码实现

    public ListNode insertionSortList(ListNode head) {
        if(head == null) return null;
        ListNode newHead = new ListNode(0);
        newHead.next = head;
        ListNode SortedLast = head;
        ListNode cur = SortedLast.next;
        while(cur != null) {
            if(SortedLast.val <= cur.val) {
                SortedLast = SortedLast.next;
                //继续判断下一个待排序的节点
                cur = SortedLast.next;
            } else {
                //进入else说明要往前面插了
                ListNode prev = newHead;
                while(prev.next.val <= cur.val) {
                    prev = prev.next;
                }
                //有序序列中最后一个数据的后继绑上下一个待排序的数据
                SortedLast.next = cur.next;
                //插入元素的后继绑上有序序列中排在它之后的数据
                cur.next = prev.next;
                //插入元素的前一个数据的后继绑上这个插入元素
                prev.next = cur;
                //继续判断下一个待排序的节点
                cur = SortedLast.next;
            }
        }
        return newHead.next;
    }

分析与插排的联系

 关键步骤分析

我们在调整结点顺序的时候,先将 SortedLast 的后继绑住下一个待排序元素,链表是有两个域的,我习惯先绑后面,再处理前一个元素的后继。

 

分析上图的1,2,3的代码:

1.有序序列最后一个元素的后继总是与待排序序列第一个元素绑定起来,循环进else,说明待插入元素的值小于SortedLast,所以就把SortedLast的后继与下一个待插入的元素绑定。

2.不管有没有进while循环,prev的位置的值一定是刚好小于cur的值,while循环的作用就是调整prev指向刚好小于cur结点的值的前一个结点。

3.把prev的后继绑住插进来的cur,形成有序序列。

 复杂度分析

1.时间复杂度

链表的排序不像数组,这里不需要挪数据,只需要修改指向就行,但是因为链表没有所谓的下标,所以找到插入位置的下标所需的时间复杂度就是 O(n) ,n 个数据的排序,所以时间复杂度为 O(n^2).

2.空间复杂度  O(1)

本篇完!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Master_hl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值