news 2026/9/24 22:42:49

【LeetCode刷题】排序链表

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【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实现,包括链表创建、打印等辅助函数,并通过多个测试用例验证了算法的正确性,包括基础用例、含负数和零的用例、空链表和单节点链表等特殊情况。

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

OneDocs | 文档分析

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

作者头像 李华
网站建设 2026/9/24 7:35:13

Arcanum Music

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

作者头像 李华
网站建设 2026/9/22 0:24:14

提示系统高可用架构:负载均衡策略的多活部署

让AI提示服务永不宕机&#xff1a;负载均衡与多活部署的架构方法论 关键词 提示系统 | 高可用架构 | 负载均衡策略 | 多活部署 | 分布式服务 | 故障转移 | 流量调度 摘要 当你用AI写作平台生成文案时&#xff0c;若接口突然报错&#xff1b;当你用智能客服咨询问题时&#xff0…

作者头像 李华
网站建设 2026/9/24 19:22:04

Python中的Mixin继承:灵活组合功能的强大模式

Python中的Mixin继承&#xff1a;灵活组合功能的强大模式 1. 什么是Mixin继承&#xff1f;2. Mixin与传统继承的区别3. Python中实现Mixin的最佳实践3.1 命名约定3.2 避免状态初始化3.3 功能单一性 4. 实际应用案例4.1 Django中的Mixin应用4.2 DRF (Django REST Framework)中的…

作者头像 李华
网站建设 2026/9/23 21:46:47

2. Ollama REST API - api/generate 接口详

Ollama 服务启动后会提供一系列原生 REST API 端点。通过这些Endpoints可以在代码环境下与ollama启动的大模型进行交互、管理模型和获取相关信息。其中两个endpoint 是最重要的&#xff0c;分别是&#xff1a;POST /api/generatePOST /api/chat其他端点情况&#xff1a;POST /a…

作者头像 李华
网站建设 2026/9/21 23:40:45

【读书笔记】《跑外卖》

《跑外卖&#xff1a;一个女骑手的世界》读书笔记 一、作者背景与写作缘起 1.1 作者简介 姓名&#xff1a;王婉&#xff08;婉婉&#xff09;出生地&#xff1a;山东某县城童年记忆&#xff1a;北京庙的传说——据说站在庙上能望见北京城&#xff0c;但她多次尝试从未看到过…

作者头像 李华