news 2026/9/2 23:47:18

【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/2 19:50:59

Qwen3-TTS 1.7B 离线整合包

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

作者头像 李华
网站建设 2026/9/2 19:51:30

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

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

作者头像 李华
网站建设 2026/9/1 21:53:09

鸿蒙中级课程笔记3—ArkUI进阶3—给应用添加交互(手势)

单一手势 点击事件&#xff08;onClick&#xff09; 单击作为常用的手势&#xff0c;可以方便地使用onClick接口实现。尽管被称为事件&#xff0c;它实际上是基本手势类型&#xff0c;等同于将count配置为1的TapGesture&#xff0c;即单击手势。 onClick与其他手势类型相同&…

作者头像 李华
网站建设 2026/9/2 8:15:57

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

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

作者头像 李华
网站建设 2026/9/2 20:41:03

深入探讨大数据领域Spark的数据倾斜问题及解决方案

深入探讨大数据领域Spark的数据倾斜问题及解决方案 关键词:大数据、Spark、数据倾斜、解决方案、分布式计算 摘要:本文聚焦于大数据领域中Spark的数据倾斜问题。首先介绍了数据倾斜问题产生的背景和重要性,界定了文章的目的和范围,明确预期读者。接着详细阐述了数据倾斜的核…

作者头像 李华
网站建设 2026/9/2 20:39:19

信奥赛C++提高组csp-s之倍增算法思想及应用之LCA

信奥赛C提高组csp-s之倍增算法思想及应用之LCA 题目描述 如题&#xff0c;给定一棵有根多叉树&#xff0c;请求出指定两个点直接最近的公共祖先。 输入格式 第一行包含三个正整数 N,M,SN,M,SN,M,S&#xff0c;分别表示树的结点个数、询问的个数和树根结点的序号。 接下来 N…

作者头像 李华