news 2026/4/29 5:57:32

【Hot 100 刷题计划】 LeetCode 148. 排序链表 | C++ 归并排序自顶向下

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Hot 100 刷题计划】 LeetCode 148. 排序链表 | C++ 归并排序自顶向下

LeetCode 148. 排序链表

📌 题目描述

题目级别:中等

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

进阶:
你可以在O(Nlog⁡N)O(N \log N)O(NlogN)时间复杂度和常数级空间复杂度下,对链表进行排序吗?

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

💡 破题思路:归并排序 (Divide and Conquer)

要在O(Nlog⁡N)O(N \log N)O(NlogN)时间内完成排序,常见的算法有快速排序、堆排序和归并排序。
但在链表这种数据结构中,**归并排序(Merge Sort)**是绝对的王者。因为它可以在合并阶段直接通过修改指针来实现,不需要像数组那样开辟大量的临时拷贝空间。

本解法采用了**自顶向下(Top-down)**的递归归并排序,核心分为两大步:

1. 分(Divide):快慢指针找中点

利用经典的快慢指针法把链表从中间一分为二。
⚠️ 极客避坑点
找中点时,fast指针必须初始化为head->next
如果fast初始化为head,在处理只有 2 个节点的链表时,slow会走到第 2 个节点。此时从中点断开,左边依然是 2 个节点,会导致递归陷入死循环,最终爆栈。让fast先走一步,可以确保在偶数节点时,slow准确停在左半部分的最后一个节点。

2. 合(Merge):双指针合并有序链表

这部分逻辑完全等同于经典的题目《21. 合并两个有序链表》。
创建一个虚拟头节点dummy,然后比较左右两半链表的当前节点,谁小谁就接在dummy的后面,最后将剩余的尾巴接上即可。


💻 C++ 代码实现 (原汁原味作者版)

classSolution{public:ListNode*sortList(ListNode*head){// 递归终止条件:如果链表为空,或只有一个节点,天然是有序的,直接返回if(!head||!head->next){returnhead;}// 1. 快慢指针找中点ListNode*slow=head;// 重点细节:fast 先走一步,防止偶数节点时划分死循环ListNode*fast=head->next;while(fast&&fast->next){slow=slow->next;fast=fast->next->next;}// 2. 将链表从 slow 处断开,分为 [head, slow] 和 [slow->next, 尾] 两部分ListNode*second=slow->next;slow->next=nullptr;ListNode*first=head;// 3. 对左右两半分别进行深度优先递归排序first=sortList(first);second=sortList(second);// 4. 将两个排序好的单链表合并returnmergeList(first,second);}// 辅助函数:合并两个有序链表ListNode*mergeList(ListNode*left,ListNode*right){ListNode*dummy=newListNode(0);ListNode*cur=dummy;while(left&&right){if(left->val<right->val){cur->next=left;left=left->next;}else{cur->next=right;right=right->next;}cur=cur->next;}// 把未遍历完的剩余部分直接挂在末尾if(left)cur->next=left;elsecur->next=right;returndummy->next;}};
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/29 5:57:26

物联网项目省电秘籍:用255Mesh LoRa模块的自主休眠与异步休眠功能,把电池寿命延长数倍

物联网项目省电实战&#xff1a;255Mesh LoRa模块休眠策略深度优化指南 在偏远地区的环境监测站里&#xff0c;一组由太阳能电池供电的传感器节点已经稳定运行了427天——这个数字让刚接手项目的王工感到惊讶。相比同行平均3-6个月更换一次电池的设备&#xff0c;这套系统采用的…

作者头像 李华
网站建设 2026/4/29 5:56:40

高功率半导体测试技术解析与Keithley ACS V5.0应用

1. 高功率半导体测试的技术挑战与行业需求在功率半导体器件领域&#xff0c;测试环节始终是制约产品可靠性和生产效率的关键瓶颈。以电动汽车用IGBT模块为例&#xff0c;单个器件需要承受高达6500V的阻断电压和数百安培的导通电流&#xff0c;这对测试系统提出了前所未有的挑战…

作者头像 李华
网站建设 2026/4/29 5:50:32

德克萨斯大学和新加坡国立大学研究者发现一个令人深思的计算盲区

这项由德克萨斯大学奥斯汀分校与新加坡国立大学联合开展的研究&#xff0c;将于2026年发表在计算语言学领域的顶级会议ACL Findings上&#xff0c;论文编号为arXiv:2604.18203v1&#xff0c;发布于2026年4月20日。有兴趣深入了解的读者可以通过该编号查询完整原文。一、那个让A…

作者头像 李华