news 2026/10/3 8:47:10

DeepSeek LeetCode 147. 对链表进行插入排序 Python3实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DeepSeek LeetCode 147. 对链表进行插入排序 Python3实现
# Definition for singly-linked list.# class ListNode:# def __init__(self, val=0, next=None):# self.val = val# self.next = nextclassSolution:definsertionSortList(self,head:ListNode)->ListNode:dummy=ListNode(0)# 哑结点,dummy.next 是已排序部分cur=headwhilecur:# 在已排序链表中找到插入位置prev=dummywhileprev.nextandprev.next.val<=cur.val:prev=prev.next# 保存下一个待处理节点nxt=cur.next# 把 cur 插入到 prev 之后cur.next=prev.nextprev.next=cur cur=nxtreturndummy.next

思路

和数组插入排序一样,维护一个有序部分,每次从原链表取一个节点,插入到有序部分的正确位置。

· dummy 是哑结点,dummy.next 指向已排序链表的头部,避免处理“插入到头部”的边界。
· 对每个 cur,从 dummy 往后找,找到最后一个值小于等于 cur.val 的节点 prev。
· 把 cur 插到 prev 后面。
· 注意先保存 nxt = cur.next,因为后面会修改 cur.next。

使用 <= 可以保持稳定性:相等元素维持原有相对顺序。

复杂度

· 时间:O(n²),最坏情况下每个节点都要从头扫描已排序部分。
· 空间:O(1),原地排序,只用常数个指针。

测试

defprint_list(head):vals=[]whilehead:vals.append(head.val)head=head.nextprint(vals)# 4 -> 2 -> 1 -> 3head=ListNode(4,ListNode(2,ListNode(1,ListNode(3))))print_list(Solution().insertionSortList(head))# [1, 2, 3, 4]# -1 -> 5 -> 3 -> 4 -> 0head=ListNode(-1,ListNode(5,ListNode(3,ListNode(4,ListNode(0)))))print_list(Solution().insertionSortList(head))# [-1, 0, 3, 4, 5]

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/3 8:45:47

深入剖析安卓的开机从BootLoader到Zygote整个过程

1. Android开机过程 要想进行开机速度的优化&#xff0c;首先需要了解开机的详细流程。开机过程从CPU上电开始&#xff0c;到锁屏界面显示出来结束。下图为比较简洁的开机流程图。 boot_simple.png 再来看一张比较详细的开机流程图 boot_flow_all_3.png 总的来说&#xff0c;…

作者头像 李华
网站建设 2026/10/3 8:45:31

Python实战第11期:面向对象编程基础

文章目录 引言:什么是面向对象编程? 一、类和对象 1. 什么是类和对象 2. 类的定义语法 3. 创建对象 二、属性和方法 1. 实例属性 2. 修改属性 3. 实例方法 4. 方法中访问和修改属性 5. 类属性 6. 类方法和静态方法 三、__init__方法 1. 什么是__init__ 2. __init__的参数 3. …

作者头像 李华
网站建设 2026/10/3 8:44:58

检索到的代码片段也可能误导 Agent:RAG 怎样处理过期信息?

一、一段"高度相关"的代码&#xff0c;来自一个已经删除的模块 你让 Agent 处理一个任务&#xff1a;给订单取消流程加幂等处理——同一个订单重复取消&#xff0c;第二次要返回已经取消的结果&#xff0c;而不是报错。为了避免它到处乱翻&#xff0c;你打开了代码检…

作者头像 李华