【LeetCode刷题】排序链表

给你链表的头结点head,请将其按升序排列并返回排序后的链表

示例 1:

输入:head = [4,2,1,3]输出:[1,2,3,4]

示例 2:

输入:head = [-1,5,3,4,0]输出:[-1,0,3,4,5]

示例 3:

输入:head = []输出:[]

提示:

  • 链表中节点的数目在范围[0, 5 *]
  • <= Node.val <=

解题思路(自顶向下归并排序)

  1. 分治拆分:用快慢指针找到链表中点,将原链表拆分为左右两个子链表;
  2. 递归排序:对左右子链表分别递归执行排序;
  3. 合并有序链表:将排序后的左右子链表合并为一个有序链表,最终得到完整的排序结果。

Python代码

from typing import Optional # Definition for singly-linked list. class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next class Solution: def sortList(self, head: Optional[ListNode]) -> Optional[ListNode]: # 递归终止条件:链表为空或只有一个节点(已有序) if not head or not head.next: return head # 步骤1:找到链表中点,拆分链表为左右两部分 mid = self.find_mid(head) right_head = mid.next mid.next = None # 断开链表,拆分出左、右子链表 # 步骤2:递归排序左右子链表 left_sorted = self.sortList(head) right_sorted = self.sortList(right_head) # 步骤3:合并两个有序子链表 return self.merge_two_sorted_lists(left_sorted, right_sorted) def find_mid(self, head: ListNode) -> ListNode: """用快慢指针找链表中点(慢指针最终指向左半部分的尾节点)""" slow = head fast = head.next # 让快指针多走一步,确保拆分后左半部分不超过右半部分 while fast and fast.next: slow = slow.next fast = fast.next.next return slow def merge_two_sorted_lists(self, l1: ListNode, l2: ListNode) -> ListNode: """合并两个有序链表,返回合并后的头节点""" dummy = ListNode(0) # 哑节点,简化合并逻辑 current = dummy while l1 and l2: if l1.val <= l2.val: current.next = l1 l1 = l1.next else: current.next = l2 l2 = l2.next current = current.next # 连接剩余节点(其中一个链表已遍历完) current.next = l1 if l1 else l2 return dummy.next # ====================== 辅助函数(测试用) ====================== def create_linked_list(nums: list) -> Optional[ListNode]: """根据列表创建链表,返回头节点""" if not nums: return None dummy = ListNode(0) current = dummy for num in nums: current.next = ListNode(num) current = current.next return dummy.next def print_linked_list(head: Optional[ListNode]) -> None: """打印链表(格式:val1 -> val2 -> ... -> None)""" current = head result = [] while current: result.append(str(current.val)) current = current.next print(" -> ".join(result) + " -> None") # ====================== 测试用例 ====================== if __name__ == "__main__": solution = Solution() # 测试用例1:基础用例(4→2→1→3) print("===== 测试用例1 =====") head1 = create_linked_list([4, 2, 1, 3]) print("排序前链表:", end="") print_linked_list(head1) sorted_head1 = solution.sortList(head1) print("排序后链表:", end="") print_linked_list(sorted_head1) # 测试用例2:含负数、零的用例(-1→5→3→4→0) print("\n===== 测试用例2 =====") head2 = create_linked_list([-1, 5, 3, 4, 0]) print("排序前链表:", end="") print_linked_list(head2) sorted_head2 = solution.sortList(head2) print("排序后链表:", end="") print_linked_list(sorted_head2) # 测试用例3:空链表 print("\n===== 测试用例3 =====") head3 = create_linked_list([]) print("排序前链表:", end="") print_linked_list(head3) sorted_head3 = solution.sortList(head3) print("排序后链表:", end="") print_linked_list(sorted_head3) # 测试用例4:单节点链表 print("\n===== 测试用例4 =====") head4 = create_linked_list([7]) print("排序前链表:", end="") print_linked_list(head4) sorted_head4 = solution.sortList(head4) print("排序后链表:", end="") print_linked_list(sorted_head4)

LeetCode提交代码

# Definition for singly-linked list. # class ListNode: # def __init__(self, val=0, next=None): # self.val = val # self.next = next class Solution: def sortList(self, head: Optional[ListNode]) -> Optional[ListNode]: # 递归终止条件:链表为空或只有一个节点(已有序) if not head or not head.next: return head # 步骤1:找到链表中点,拆分链表为左右两部分 mid = self.find_mid(head) right_head = mid.next mid.next = None # 断开链表,拆分出左、右子链表 # 步骤2:递归排序左右子链表 left_sorted = self.sortList(head) right_sorted = self.sortList(right_head) # 步骤3:合并两个有序子链表 return self.merge_two_sorted_lists(left_sorted, right_sorted) def find_mid(self, head: ListNode) -> ListNode: """用快慢指针找链表中点(慢指针最终指向左半部分的尾节点)""" slow = head fast = head.next # 让快指针多走一步,确保拆分后左半部分不超过右半部分 while fast and fast.next: slow = slow.next fast = fast.next.next return slow def merge_two_sorted_lists(self, l1: ListNode, l2: ListNode) -> ListNode: """合并两个有序链表,返回合并后的头节点""" dummy = ListNode(0) # 哑节点,简化合并逻辑 current = dummy while l1 and l2: if l1.val <= l2.val: current.next = l1 l1 = l1.next else: current.next = l2 l2 = l2.next current = current.next # 连接剩余节点(其中一个链表已遍历完) current.next = l1 if l1 else l2 return dummy.next

程序运行结果展示

===== 测试用例1 ===== 排序前链表:4 -> 2 -> 1 -> 3 -> None 排序后链表:1 -> 2 -> 3 -> 4 -> None ===== 测试用例2 ===== 排序前链表:-1 -> 5 -> 3 -> 4 -> 0 -> None 排序后链表:-1 -> 0 -> 3 -> 4 -> 5 -> None ===== 测试用例3 ===== 排序前链表: -> None 排序后链表: -> None ===== 测试用例4 ===== 排序前链表:7 -> None 排序后链表:7 -> None

总结

本文实现了一个链表排序算法,采用自顶向下的归并排序方法。算法分为三个步骤:

(1)使用快慢指针找到链表中点并拆分链表;

(2)递归排序左右子链表;

(3)合并两个有序子链表。

该方法时间复杂度为O(nlogn),空间复杂度为O(logn)。文中提供了完整的Python实现,包括链表创建、打印等辅助函数,并通过多个测试用例验证了算法的正确性,包括基础用例、含负数和零的用例、空链表和单节点链表等特殊情况。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1216039.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LLMs之SkillScan:《Agent Skills in the Wild: An Empirical Study of Security Vulnerabilities at Scale》翻译

LLMs之SkillScan&#xff1a;《Agent Skills in the Wild: An Empirical Study of Security Vulnerabilities at Scale》翻译与解读 导读&#xff1a;本文首次以规模化、经验证的方法系统审视了代理技能生态中的安全风险&#xff1a;通过采集 >42k 技能并分析 31k&#xff0…

Jakarta NoSQL Template 核心特性与应用实践之一

1. Jakarta NoSQL Template 概述 1.1 Jakarta NoSQL 项目简介 标准化NoSQL访问:为Java开发者提供统一的NoSQL数据库访问API 多模型支持:支持文档、列式、键值、图形等多种NoSQL数据模型 轻量级框架:基于注解驱动的编程模型,简化开发 1.2 Template 模块的核心作用 模板模式…

探讨大数据领域存算分离的未来趋势

探讨大数据领域存算分离的未来趋势 关键词&#xff1a;存算分离、大数据架构、分布式存储、弹性计算、云原生、资源解耦、数据湖 摘要&#xff1a;本文从“餐厅厨房革命”的生活案例切入&#xff0c;逐步解析大数据领域“存算分离”的核心逻辑。通过对比传统存算一体架构的痛点…

不仅是手速:为什么资深程序员最终都转了双拼?(附练习工具)

引言&#xff1a;你的输入法&#xff0c;可能是你效率的 O(n^2) 瓶颈 作为一个每天敲几千行代码和注释的开发者&#xff0c;我们习惯于优化算法复杂度&#xff0c;从 O(n^2) 优化到 O(n)&#xff0c;甚至为了几十毫秒的延迟去重构架构。 但是&#xff0c;绝大多数人却在容忍一…

实用指南:03-gpg(证书管理 )详细范例

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

数据中台建设中的数据集成方案:CDC技术详解

数据中台建设中的数据集成方案&#xff1a;CDC技术详解关键词&#xff1a;数据中台、数据集成、CDC技术、Change Data Capture、实时数据同步摘要&#xff1a;本文围绕数据中台建设中的数据集成方案&#xff0c;深入剖析了CDC&#xff08;Change Data Capture&#xff09;技术。…

《把脉行业与技术趋势》-103-通信“人“解决了人与人之间通过“电“进行快速的信息交流,不受时间、空间的限制。微信、移动互联网都得益于通信技术解决了系统中任意两个节点之间快速的信息交换。

通信"人"解决了人与人之间通过"电"进行快速的信息交流&#xff0c;不受时间、空间的限制。微信、移动互联网、大数据、AI都得益于通信技术解决了任意一个系统中两个节点之间快速的信息交换。 然而&#xff0c;现实世界由人组成的系统&#xff0c;通信的两个…

Arcanum Music

链接: https://pan.baidu.com/s/1ZERy_k5jLFOkdDMruxdpRw 提取码: txym【楼主评价】&#xff1a;聚合四大平台[顶!]畅听全网歌曲【软件名称】&#xff1a;ArcanumMusic【软件版本】&#xff1a;v1.6.7【软件大小】&#xff1a;740m【适用平台】&#xff1a;Windows系统/Linux系…

电脑软件MusicDownloader

链接&#xff1a;https://pan.quark.cn/s/aa7f2ad44edc【软件名称】&#xff1a;MusicDownloader【软件版本】&#xff1a;v1.0.0【软件大小】&#xff1a;40m【测试平台】:win10 64位系统【官方介绍】&#xff1a;某☁️音乐下载器&#xff08;Modern Music Downloader&#x…

Ceru Music 澜音

链接: https://pan.baidu.com/s/1S13IYKBZMo1Uvc2Vg54Jzg 提取码: bpds楼主评价】&#xff1a;畅听全网[顶!]支持无损下载[顶!]附带音源【软件名称】&#xff1a;Ceru Music 澜音【软件版本】&#xff1a;v1.7.11【软件大小】&#xff1a;1.86G【适用平台】&#xff1a;Windows…

Qwen3-TTS 1.7B 离线整合包

链接&#xff1a;https://pan.quark.cn/s/e4e555e2af9bQwen3-TTS&#xff08;Text To Speech&#xff09; 是由 Qwen 开发的一系列功能强大的语音生成&#xff0c;全面支持音色克隆、音色创造、超高质量拟人化语音生成&#xff0c;以及基于自然语言描述的语音控制。直接将开源T…

Linux Bench | 综合性Linux服务器性能测试与网络质量检测脚本

链接&#xff1a;https://pan.quark.cn/s/d6f1d0059b21集成了业界主流的测试工具&#xff0c;提供一键式的硬件性能评估、网络连通性测试及流媒体服务解锁检测

AI Agent开发实践:关键步骤和最佳实践

AI Agent开发实践:关键步骤和最佳实践 关键词:AI Agent、开发实践、关键步骤、最佳实践、人工智能 摘要:本文围绕AI Agent开发实践展开,深入探讨其关键步骤和最佳实践。首先介绍了AI Agent开发的背景,包括目的、预期读者、文档结构和相关术语。接着阐述了AI Agent的核心概…

OneDocs | 文档分析

链接&#xff1a;https://pan.quark.cn/s/fdf021c6ec55支持平台&#xff1a;#Windows #macOS #Linux一款智能文档分析工具&#xff0c;可以快速提取和理解文档中的关键信息。支持多种常见文档格式&#xff0c;包括PDF、Word、PPT、Excel和TXT&#xff0c;最大支持50MB的文件大小…

DP Animation Maker(动画制作工具)

链接&#xff1a;https://pan.quark.cn/s/adccc0075a4cDP Animation Maker是一款动画制作工具&#xff0c;可以帮助用户创建动画背景&#xff0c;提供了众多动画特效&#xff0c;即使是小白用户也可以很好的制作出动画。软件特色动画视频。网页横幅。视频。数字贺卡。手机背景。…

最优化理论综述

最优化理论是数学中的一个重要分支,主要研究如何在给定约束下找到目标函数的最优解(最小值或最大值)。它广泛应用于工程、经济学、机器学习等领域。以下从数学基础、优化建模、线性规划方法等方面详细总结文档内容,…

震撼上线!大数据领域Zookeeper的故障处理实战

大数据运维必看&#xff1a;Zookeeper故障处理实战手册——从排查到恢复的全流程解析 副标题&#xff1a;覆盖节点宕机、脑裂、数据不一致等10常见故障&#xff0c;帮你把停机时间从小时级缩到分钟级 摘要/引言 在大数据集群中&#xff0c;Zookeeper是当之无愧的“分布式协调…

【车牌识别】基于计算机视觉的多雾环境停车计费系统附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和数学建模资料 &#x1f34…

Java毕设选题推荐:基于springboot的房产交易系统基于java+springboot+vue的房产销售系统【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

计算机Java毕设实战-基于springboot的房产交易系统二手房交易和交流平台管理系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…