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

leetcode-链表排序

链表不同与数组,因为有方向,所以和数组排序能用很多方法不同,比较适合的就是归并排序。

这里是学习的灵神的方法:在刚开始学习积累的时候,建议在B站先看灵神的解读【反转链表【基础算法精讲 06】-哔哩哔哩】 https://b23.tv/63r1l12,先不看代码,自己写,然后看题解。

归并排序(分治)

class Solution:# 876. 链表的中间结点(快慢指针)def middleNode(self, head: Optional[ListNode]) -> Optional[ListNode]:slow = fast = headwhile fast and fast.next:pre = slow  # 记录 slow 的前一个节点slow = slow.nextfast = fast.next.nextpre.next = None  # 断开 slow 的前一个节点和 slow 的连接return slow# 21. 合并两个有序链表(双指针)def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:cur = dummy = ListNode()  # 用哨兵节点简化代码逻辑while list1 and list2:if list1.val < list2.val:cur.next = list1  # 把 list1 加到新链表中list1 = list1.nextelse:  # 注:相等的情况加哪个节点都是可以的cur.next = list2  # 把 list2 加到新链表中list2 = list2.nextcur = cur.nextcur.next = list1 if list1 else list2  # 拼接剩余链表return dummy.nextdef sortList(self, head: Optional[ListNode]) -> Optional[ListNode]:# 如果链表为空或者只有一个节点,无需排序if head is None or head.next is None:return head# 找到中间节点 head2,并断开 head2 与其前一个节点的连接# 比如 head=[4,2,1,3],那么 middleNode 调用结束后 head=[4,2] head2=[1,3]head2 = self.middleNode(head)# 分治head = self.sortList(head)head2 = self.sortList(head2)# 合并return self.mergeTwoLists(head, head2)

整体是一个递归的思想,这个sortList函数首先把一个链表一分为二(采用快慢指针找链表中点,然后断开中点和后面一个节点的连接)。然后对这个被分成两段的链表,要得到它们的排序新链表,也要调用sortList函数,直到递归到只有一个节点或者空节点,就不用排序了。

(1)把链表递归一分为二

(2)递归直到分到最小,返回合并后的,一层层全部合并完,在合并的过程中完成了排序。

时间复杂度:O(nlogn)     空间复杂度:O(logn)[递归的深度]

http://www.dtcms.com/a/275775.html

相关文章:

  • Matlab中optimoptions的用法
  • docker 443错误 lookup docker.mirrors.ustc.edu.cn: no such host
  • Hap包引用的Hsp报签名错误怎么解决
  • ABSD(基于架构的软件开发)深度解析:架构驱动的工程范式
  • 初学者关于算法复杂度的学习笔记
  • goframe框架中获取url内容并转成Base64字符串
  • 【QGC】深入解析 QGC 配置管理
  • AAAI-2025 | 西交模拟人类空间推理策略的具身导航!REGNav:房间专家引导的图像目标导航
  • Linux文件的权限
  • Kotlin基础学习记录
  • 【MediaSoup】MS_DUMP打印转换为PLOGI的形式
  • Python-难点-uinttest
  • 网络资源模板--基于Android Studio 实现的记事本App
  • 通过卫星图像追踪城市扩张
  • Windows npx n8n 方式运行n8n密码忘了重置密码
  • IDEA中一个服务创建多个实例
  • PyQt5布局管理(QBoxLayout(框布局))
  • 企业商业秘密保卫战:经营信息类案件维权全攻略
  • WildCard野卡已跑路(包含gpt plus升级方案)
  • C++结构体嵌套
  • Datawhale AI夏令营 MCP初体验——简历小助手
  • DeepSeek-Qwen蒸馏模型解析
  • 苍穹外卖-day06
  • 自助空间系统迭代历程|自助门店运营系统全新升级
  • AI炼丹日志-30-新发布【1T 万亿】参数量大模型!Kimi‑K2开源大模型解读与实践
  • 电子电气架构 --- ECU存储与计算资源冗余设计规范
  • 实习内容总结
  • 笔记/了解未来:财务建模与预测
  • 系统思考助力转型
  • Git企业级开发(最终篇)