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

JAVA练习301- 排序链表

题目概览

给你链表的头结点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 * 10^4]
  • -10^5 <= Node.val <= 10^5

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

来源:148. 排序链表 - 力扣(LeetCode)

解题分析

方法:快慢指针 + 归并排序

归并排序的时间复杂度是 O(nlogn),该排序的原理是将数组不断进行二分拆分直到单个元素,然后从最小的数组两两开始不断合并,由于子数组是排好序的,因此按照顺序挨个比较大小就可以排序。
由于链表没有索引,我们可以用快慢指针代替,慢指针遍历一个节点,快指针遍历两个节点,当快指针遍历完成时,慢指针刚好到中间节点,因此我们可以根据慢节点对链表进行拆分,从而进行归并排序。

时间复杂度:O(nlogn)
空间复杂度:O(logn)

/** * 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) { return head; } return sort(head, null); } public ListNode sort(ListNode start, ListNode end) { if (start == end || start.next == end) { start.next = null; return start; } ListNode a = start, b = start; while(b != end && b.next != end) { a = a.next; b = b.next.next; } // print(start); ListNode left = sort(start, a);; ListNode right = sort(a, end); return merge(left, right); } private void print(ListNode a) { StringBuilder sb = new StringBuilder(); while(a != null) { sb.append(a.val); sb.append(","); a = a.next; } System.out.println(sb.toString()); } public ListNode merge(ListNode a, ListNode b) { ListNode res = new ListNode(), pre = res; while(a != null && b != null) { if (a.val <= b.val) { pre.next = a; a = a.next; } else { pre.next = b; b = b.next; } pre = pre.next; } if (a != null) { pre.next = a; } else if (b != null) { pre.next = b; } return res.next; } }
http://www.jsqmd.com/news/1209766/

相关文章:

  • 收藏!2026前端转行AI大模型应用开发:从0到1落地指南(附完整学习路线)
  • 合肥地区蓝牌小货车怎么联系 本地靠谱购车服务指南 - 热点品牌推荐
  • 电子证件照片制作全教程:手机免费操作、微信支付宝流程、标准尺寸底色大全
  • C++模板元编程:编译期计算
  • 2026上海网站建设公司参考:好看之外,企业官网还应该具备哪些能力? - IT超人老张
  • 干法刻蚀工艺选择比优化实战指南
  • 2026设备工程师进阶学数据分析的技术价值
  • 亲身到店探访南京天梭官方售后服务中心|官方电话及维修地址(2026年7月最新) - 天梭服务中心
  • 微信小程序二维码生成深度解析:weapp-qrcode架构设计与最佳实践
  • 2024-2026主流魔方速拧选购指南:磁力可调与轻量化趋势解析
  • 江诗丹顿中国官方售后服务中心|服务热线与门店详细地址权威信息公告(2026年7月更新) - 江诗丹顿官方服务中心
  • 如何快速同时启动多个exe
  • 2026苏州APP开发公司盘点:制造业企业做APP时要注意什么? - IT超人老张
  • 怎么样让AI写出来的东西没有AI味?这3个工具帮你一键去味
  • 浪琴中国官方售后服务中心|服务热线及完整维修地址权威信息声明(2026年7月最新) - 浪琴官方售后服务中心
  • # 2026年武汉离婚律师推荐怎么选?13年实战丁嫣团队经验分享 - 本地品牌推荐
  • JAVA练习300- 随机链表的复制
  • 亲身到店探访长沙卡地亚官方售后服务中心|官方电话和维修地址(2026年7月最新) - 卡地亚服务中心
  • DolphinDB实时聚合计算:多维度聚合
  • 浪琴中国官方售后服务中心|全新电话和网点地址权威信息声明(2026年7月更新) - 浪琴服务中心
  • 2026年07月 万向重型脚轮生产厂家选型参考:承载与场景并重的专业供应企业解析 - 甄选服务推荐
  • 视频长文1
  • 通用GUI技术编程指南:MVC / MVP / MVVM / Elm Architecture:同一道题的四代解法
  • 2026苏州小程序开发团队怎么选?从上线速度聊到长期运营 - IT超人老张
  • 2026正阶速拧主力选手技术解析与竞技格局展望
  • Meta撤回Muse Image功能 隐私争议迫使AI工具下线
  • 柔软亲肤悬挂抽纸哪家好:联盛森宝柔和细腻 - MXyuyu
  • GAN SG-1魔方磁力定位与波动结构设计深度解析
  • 欧米茄官方售后服务中心全部网点地址与客服电话实地考察报告多信源验证(2026年7月更新) - 欧米茄官方服务中心
  • 鸿蒙 ArkTS 实战:Conference Interpretation Glossary 从业务记录到移动工作台完整解析