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

二十四 148. 排序链表

148. 排序链表https://leetcode.cn/problems/sort-list/

给你链表的头结点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 * 104]
  • -105 <= Node.val <= 105

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

关键代码解析

代码作用为什么
for (int step = 1; step < length; step *= 2)控制子链表长度1→2→4→8,直到覆盖整个链表
cut(left, step)切出长度为 step 的段物理切断链表,返回下一段头
head.next = null切断链表让左/右段独立成链表
merge(left, right)合并两段有序链表21题的标准技巧
prev指针连接各段合并结果保持链表连续性
while (prev.next != null)移动 prev 到末尾为下一次合并做准备

执行流程图解

[4, 2, 1, 3]为例(length=4):

原始: 4 → 2 → 1 → 3 ========== step = 1: 每1个合并成2个有序 ========== 初始: dummy → 4 → 2 → 1 → 3 ↑ curr 第1次合并: left = [4], cut后 leftEnd = 2 right = [2], cut后 rightEnd = 1 merge([4], [2]) = [2, 4] dummy → 2 → 4 1 → 3 ↑ ↑ prev curr 第2次合并: left = [1], right = [3] merge([1], [3]) = [1, 3] dummy → 2 → 4 → 1 → 3 ↑ prev 结果: 2 → 4 → 1 → 3(两个长度为2的有序段) ========== step = 2: 每2个合并成4个有序 ========== dummy → 2 → 4 → 1 → 3 ↑ curr 第1次合并: left = [2, 4], cut 2步后 leftEnd = 1 right = [1, 3], cut 2步后 rightEnd = null merge([2,4], [1,3]) = [1, 2, 3, 4] dummy → 1 → 2 → 3 → 4 ↑ prev curr = null,结束 ========== step = 4: 4 < 4? 否,结束 ========== 返回 [1, 2, 3, 4] ✅
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */ //自底向上迭代版 class Solution { public ListNode sortList(ListNode head) { if(head == null || head.next == null){ return head;// 空或单节点,已有序 } // ========== 步骤1: 计算链表长度 ========== int length = 0; ListNode node = head; while(node != null){ length++; node = node.next; } // ========== 步骤2: 自底向上归并排序 ========== ListNode dummy = new ListNode(0); dummy.next = head; // step: 当前要合并的子链表长度(1, 2, 4, 8...) for(int step = 1; step < length; step *= 2){ ListNode prev = dummy;// 上一段有序链表的尾 ListNode curr = dummy.next;// 当前待处理位置 while(curr != null){ // 切出左半部分 [curr, leftEnd),长度为 step ListNode left = curr; ListNode leftEnd = cut(left, step); // 切出右半部分 [leftEnd, rightEnd),长度为 step ListNode right = leftEnd; ListNode rightEnd = cut(right, step); // 记录下一轮的起点 curr = rightEnd; // 合并左右两部分,接到 prev 后面 prev.next = merge(left, right); // prev 移动到合并后链表的末尾 while(prev.next != null){ prev = prev.next; } } } return dummy.next; } /** * 切断链表:从 head 开始保留 n 个节点,返回第 n+1 个节点 * head -> n1 -> n2 -> ... -> nn -> next * 变成: head -> n1 -> ... -> nn -> null * 返回: next */ private ListNode cut(ListNode head, int n){ if(head == null){ return null; } // 走 n-1 步,到达第 n 个节点 for(int i = 1; i < n && head.next != null; i++){ head = head.next; } ListNode next = head.next;// 保存断点 head.next = null;// 切断 return next; // 返回下一段的头 } /** * 合并两个有序链表(21题的标准写法) */ private ListNode merge(ListNode l1, ListNode l2){ ListNode dummy = new ListNode(0); ListNode cur = dummy; while(l1 != null && l2 != null){ if(l1.val < l2.val){ cur.next = l1; l1 = l1.next; }else{ cur.next = l2; l2 = l2.next; } cur = cur.next; } cur.next = (l1 != null) ? l1 : l2; return dummy.next; } }
http://www.jsqmd.com/news/616204/

相关文章:

  • Safeboxie沙盘,电脑多开程序神器,系统安全工具,非常好用!
  • OpenClaw社交管理:Qwen3-4B-Thinking-2507-GPT-5-Codex-Distill-GGUF自动回复微博评论
  • 【2026企业级Blazor落地白皮书】:金融/医疗场景下SSR+Hydration+Streaming SSR三模混合渲染实战(附GCP/Azure边缘部署Checklist)
  • 2026成都上门奢侈品回收:成都实体奢侈品回收/成都本地奢侈品回收/成都正规名表回收电话/成都珠宝奢侈品回收/选择指南 - 优质品牌商家
  • ESPS USB MSC 调试全过程记录瓢
  • 告别datetime烦恼:dateutil解析器如何智能处理任意日期字符串
  • OpenClaw异常处理机制:Qwen3-32B-Chat镜像自动修复失败任务
  • 绍兴Geo优化,如何选对靠谱服务商?
  • .NET对象转JSON,到底有几种方式?茄
  • Mysql--基础知识点--94.1--嵌套子查询转关联查询
  • 2026年知名的威海大学生穷游住宿酒店大众好评榜 - 行业平台推荐
  • CodeMagicianT簿
  • MMDetection的学习笔记
  • 【算法日记 09】蓝桥杯实战:突破整数极限,拥抱“字符串思维”
  • Win10 停更、Win11 臃肿?试试这款精简win11系统,老电脑也能快到飞起,完整安装指南:手把手教你下载
  • 深度排查:Hyper-V 已关但 VirtualBox 仍报错的完整解决方案
  • OSCPRepo单词列表与密码字典:全面渗透测试资源清单
  • 2026苏稽跷脚牛肉top名录:苏稽跷脚牛肉最出名的牌子推荐/乐山苏稽古镇附近跷脚牛肉推荐/乐山苏稽特色推荐榜/选择指南 - 优质品牌商家
  • 终极ytdl-sub订阅配置教程:打造完美媒体库的完整解决方案
  • 电子书管理神器:OpenClaw+千问3.5-27B自动分类Calibre书库
  • 2026北京灭火器回收技术全解析:合规与环保双达标 - 优质品牌商家
  • Specs扩展开发指南:如何自定义存储类型和系统行为
  • 分享一个网络智能运维系统
  • 2026年热门的性价比高的酒店本地推荐 - 行业平台推荐
  • 从零搭建PHP智能校验系统:TensorFlow Lite轻量模型+PHP-Parser AST分析+实时反馈看板(完整Docker化部署手册)
  • sqlite_orm完全指南:现代C++中最强大的轻量级ORM库
  • OpenClaw模型微调指南:优化Qwen2.5-VL-7B特定场景图文识别准确率
  • 模型微调实战:让gemma-3-12b-it更好适配OpenClaw的自动化需求
  • 15DaysofAnimationsinSwift GIF动画播放:在iOS应用中集成动态图像
  • Linux内核中的网络协议栈详解