当前位置: 首页 > news >正文

Leetcode-148.排序链表

image.png
注意归并排序的细节:
用快慢指针找到中间的指针。
中间指针在慢指针后面
注意慢指针要断链

快慢指针原理:

while fast and fast.next:slow = slow.nextfast = fast.next.next

退出时有两种可能:

  1. 链表长度是偶数

    • fast 先跑到最后一个节点,再走两步直接变成 None

    • 循环条件里 fastNone,退出

  2. 链表长度是奇数

    • fast 最后落在最后一个节点

    • fast.nextNone,循环条件里 fast.nextNone,退出

举例验证

  • 长度 4:1→2→3→4

    • 最后一步 fast=4fast.next=None → 再走两步时 fast=None → 循环退出
  • 长度 5:1→2→3→4→5

    • 最后一步 fast=5fast.next=None → 循环退出

快慢指针分割链表

mid = slow.next
slow.next = None

也就是说,mid 取的是 slow 的下一个节点


快慢指针找中点的逻辑

  • slow 每次走一步

  • fast 每次走两步

  • 循环条件:while fast and fast.next:

循环退出时,slow 会落在 中点偏左的位置

为什么不是直接 mid = slow

  • 如果直接取 mid = slow,那么递归时左半部分和右半部分会有 交叉节点

  • 因为 slow 还连着后半部分链表,递归时左半部分就不纯粹了。

所以必须 断链

mid = slow.next
slow.next = None   # 把 slow 和 mid 之间切断

这样得到:

  • 左半部分:从 headslow

  • 右半部分:从 mid 到末尾

举例说明

链表:1 → 2 → 3 → 4

  • 初始:slow=1, fast=2

  • 迭代1:slow=2, fast=4

  • 退出时:slow=2

这时:

  • mid = slow.next = 3

  • 断链:slow.next = None

结果:

  • 左半部分:1 → 2

  • 右半部分:3 → 4

如果错误地用 mid = slow

  • 左半部分:1 → 2 → …(还会连到 3)

  • 右半部分:2 → 3 → 4(和左半部分重叠)

递归就会出问题,甚至死循环。

# Definition for singly-linked list.# class ListNode:#     def __init__(self, val=0, next=None):#         self.val = val#         self.next = nextclass Solution:def merge(self,L1,L2):dummy=ListNode(0)tail=dummywhile L1  and L2 :if L1.val > L2.val:tail.next=L2L2=L2.nextelse:tail.next=L1L1=L1.nexttail=tail.nextwhile L1:tail.next=L1L1=L1.nexttail=tail.nextwhile L2:tail.next=L2L2=L2.nexttail=tail.nextreturn dummy.nextdef merge_sort(self,head):if  not head or not head.next:return headslow,fast=head,head.nextwhile fast and fast.next :slow=slow.nextfast=fast.next.nextmid=slow.nextslow.next=Noneleft=self.merge_sort(head)right=self.merge_sort(mid)return self.merge(left,right)def sortList(self, head):return self.merge_sort(head)

排序链表 vs 数组归并排序 的对比总结:

数组 vs 链表归并排序对比

1. 如何分割

  • 数组

    • 通过下标 mid = (left+right)//2 来划分区间 [left, mid][mid+1, right]

    • 不需要真正切断数组,递归时用下标控制。

  • 链表

    • 不能随机访问,只能用 快慢指针 找到中点。

    • 找到 slow 后,通过 slow.next = None断链,分成两段独立子链表。

2. 如何合并

  • 数组

    • merge(arr, left, mid, right) 时,需要复制左右两段到临时数组 LR,再一个个写回原数组。

    • 时间 O(n),额外空间 O(n)。

  • 链表

    • merge(l1, l2) 直接操作指针,把两个有序链表拼接起来。

    • 不需要额外数组空间,只需要几个辅助指针。

    • 时间 O(n),空间 O(1)。

3. 递归终止条件

  • 数组

    if left >= right: return
    

    只剩一个元素(或空区间)时,直接返回。

  • 链表

    if not head or not head.next: return head
    

    空链表或单节点链表,天然有序,直接返回。

4. 时间复杂度

  • 两者都是:

    • 递归分治深度 O(log n)

    • 每层合并 O(n)

    • 总复杂度 O(n log n)

5. 空间复杂度

  • 数组归并排序

    • 需要额外临时数组(每次 merge 时),总体 O(n) 辅助空间。
  • 链表归并排序

    • 只需要少量指针变量,辅助空间 O(1)(如果不算递归栈)。

    • 这是链表排序的一个优势。


文章转载自:

http://NJQWYLqk.gychx.cn
http://91dfy3mr.gychx.cn
http://QvVy62wo.gychx.cn
http://T5OvFiEH.gychx.cn
http://SNdgZcs4.gychx.cn
http://2JiKtUYL.gychx.cn
http://iwOU0rHH.gychx.cn
http://3SfxPfEv.gychx.cn
http://wboZGvzS.gychx.cn
http://BNRTKDKS.gychx.cn
http://1WbpXr8o.gychx.cn
http://vC99WJEJ.gychx.cn
http://yG4vtWaT.gychx.cn
http://M4ZGfUcr.gychx.cn
http://hNxdcRmZ.gychx.cn
http://kebLuNp5.gychx.cn
http://YR40BB5Q.gychx.cn
http://Y31fPZKn.gychx.cn
http://rSGs44V7.gychx.cn
http://arCfil1U.gychx.cn
http://4LumARRe.gychx.cn
http://hZx9pgnG.gychx.cn
http://sNJcssaI.gychx.cn
http://iNKJhQwY.gychx.cn
http://fXjg6hbz.gychx.cn
http://LixScO0b.gychx.cn
http://jDKbADFA.gychx.cn
http://WVCJIqbQ.gychx.cn
http://MGiex00I.gychx.cn
http://6VrKJSV3.gychx.cn
http://www.dtcms.com/a/388080.html

相关文章:

  • 基于ETF底仓的网格交易系统实现动态参数优化与动量因子融合
  • C++底层刨析章节三: 函数对象与适配器:STL中的智能操作单元
  • MySQL多表联合查询与数据备份恢复全解析
  • 说说对React的理解?有哪些特性?
  • 深入理解 C 语言指针(二):数组与指针的深度绑定
  • 算法能力提升之树形结构-(线段树)
  • 小白实测:异地访问NAS所用的虚拟局域网使用感受及部署难度?!
  • js校验车架号VIN算法
  • MongoDB 8.0全面解析:性能提升、备份恢复与迁移指南
  • vue3如何配置不同的地址访问不同的项目
  • 苹果软件代码混淆,iOS混淆、iOS加固、ipa安全与合规取证注意事项(实战指南)
  • SQL-约束
  • [torch] 非线性拟合问题的训练
  • ubuntu设置ip流程
  • 【论文阅读】谷歌:生成式数据优化,只需请求更好的数据
  • 【深度学习】什么是过拟合,什么是欠拟合?遇到的时候该如何解决该问题?
  • CSA AICM 国际标准:安全、负责任地开发、部署、管理和使用AI技术
  • AI 赋能教育:个性化学习路径设计、教师角色转型与教育公平新机遇
  • 科技为老,服务至心——七彩喜智慧养老的温情答卷
  • ​​[硬件电路-237]:电阻、电容、电感虽均能阻碍电流流动,但它们在阻碍机制、能量转换、相位特性及频率响应方面存在显著差异
  • 内网Windows系统离线安装Git详细步骤
  • @Component 与 @Bean 核心区别
  • Rsync 详解:从入门到实战,掌握 Linux 数据同步与备份的核心工具
  • ffmpeg解复用aac
  • 数据结构--3:LinkedList与链表
  • linx 系统 ffmpeg 推流 rtsp
  • 防水淹厂房监测报警系统的设计原则及主要构成
  • RFID技术赋能工业教学设备教学应用经典!
  • Java工程依赖关系提取与可视化操作指南(命令行篇)
  • 服务器中不同RAID阵列类型及其优势