题目分析核心思路归并排序。链表天然适合归并排序不需要额外空间。步骤分割快慢指针找到中点断开链表。递归排序左右两半分别排序。合并合并两个有序链表。时间复杂度O(n log n)空间复杂度O(log n)递归栈。Java 实现class Solution {public ListNode sortList(ListNode head) {if (head null || head.next null) {return head;}// 1. 快慢指针找中点slow 最终指向前半段的最后一个节点 ListNode slow head, fast head.next; while (fast ! null fast.next ! null) { slow slow.next; fast fast.next.next; } // 2. 断开链表分成两半 ListNode mid slow.next; slow.next null; // 3. 递归排序左右两半 ListNode left sortList(head); ListNode right sortList(mid); // 4. 合并两个有序链表 return merge(left, right); } 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; }}关键点说明要点 说明快慢指针 fast head.next 而非 head确保偶数长度时 slow 停在前半段末尾避免死循环断开链表 slow.next null 是关键否则递归不会终止合并操作 经典的双指针合并时间复杂度 O(n)递归终止 head null head.next null 时直接返回进阶自底向上归并排序O(1) 空间如果要求空间复杂度 O(1)可以用迭代版归并排序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. 自底向上归并步长从 1 开始每次翻倍 ListNode dummy new ListNode(0, head); for (int step 1; step length; step 1) { ListNode prev dummy; ListNode curr dummy.next; while (curr ! null) { // 拆分左半部分 ListNode left curr; ListNode right split(left, step); // 拆分右半部分并返回下一段的起始节点 curr split(right, step); // 合并左右两部分prev 指向合并后的尾节点 prev merge(left, right, prev); } } return dummy.next; } // 从 head 开始切出 n 个节点返回第 n1 个节点即下一段头部 private ListNode split(ListNode head, int n) { if (head null) return null; for (int i 1; i n head.next ! null; i) { head head.next; } ListNode next head.next; head.next null; return next; } // 合并 l1 和 l2接到 prev 后面返回合并后的尾节点 private ListNode merge(ListNode l1, ListNode l2, ListNode prev) { ListNode curr prev; while (l1 ! null l2 ! null) { if (l1.val l2.val) { curr.next l1; l1 l1.next; } else { curr.next l2; l2 l2.next; } curr curr.next; } curr.next (l1 ! null) ? l1 : l2; // 找到合并后的尾节点 while (curr.next ! null) { curr curr.next; } return curr; }}⚠️ 面试中如果面试官问能不能做到 O(1) 空间就写迭代版。一般情况下递归版已经足够。需要我把 Python3 或 Rust 版本也写出来吗
企业数字化 ERP 产品动态
相关推荐
一个公司有多个品牌或产品线,扫码营销要共用一套系统还是分开做? 一个公司有多个品牌或产品线,扫码营销要共用一套系统还是分开做?
太长不看版
对不少多品牌企业而言,可以优先评估“统一底层平台 品牌独立运营”的架构,而不是直接为每个品牌建设一套完全孤立的系统。
统一平台适合管理码库、用户… · 2026/9/26 4:10:40
本地部署 VS 云端 API:把硬件、电费、调用量三笔账算清再决定 「要不要自己买卡跑大模型」这个问题,在 2026 年被问得比「哪个模型更强」还多。
但真实情况是:一上来就买卡的人,很多在第三个月开始后悔;一直不敢用的人,又在为每月的 API 账单心疼。
两边都没错,错的只是… · 2026/9/26 4:10:40
Quad Flat Packages(QFP)详解:从引脚到封装工艺 1. 引言
Quad Flat Package(QFP,四边扁平封装)是表面贴装技术(SMT)中应用最广泛的集成电路封装形式之一。它的引脚从封装体四边引出,呈扁平翼状(Gull-wing)结构,因此得名… · 2026/9/26 4:10:40
VS2022+CMake构建ZXing C++:从配置到链接排雷指南 本机 VS2022 配 CMake 构建 ZXing C 这件事,我前前后后折腾过不少次,每次重装环境或者换项目都能踩出新花样。这次把完整的操作流程、CMake 参数拆解和排雷笔记一次性整理出来,给打算在 Windows 平台上把条码识别接到 C 工程里的朋友做个参考… · 2026/9/26 4:54:55
qt-virt-manager:统一管理KVM、LXC等七种虚拟化后端 简介:qt-virt-manager 是一款基于 Qt C 框架构建的跨平台图形化虚拟机管理工具,面向系统管理员、运维工程师及虚拟化技术学习者,旨在用统一界面简化对 VMware、LXC、BHYVE、Libvirt、Hyper-V、OpenVZ、QEMU-KVM、VirtualBox 等多种虚拟化平台… · 2026/9/26 4:54:55
从RHCE到生产环境:NFS服务配置、权限与高可用实战指南 早年间准备RHCE认证的时候,NFS是我最不放在眼里的一块内容——装个nfs-utils、改一行/etc/exports、mount一挂,十分钟就能交差。直到后来真在企业里搭生产环境的文件共享,才发现考场里那套"标准答案"放在业务现场,能踩出… · 2026/9/26 4:54:55
从单体到服务化:SOA核心原理与模拟实战指南 1. 为什么我会去啃SOA:单体架构的痛点与业务重用的诱惑先交代一下背景。有段时间我在维护一个典型的单体系统,业务模块之间代码相互交叉,一个订单状态变更要触发五个内部类的同步修改,再加上周围三个外围系统各自有一套"订单… · 2026/9/26 4:54:55
ASP.NET MVC C# 优惠券领取微信小程序源码:库存并发与防重复领实战 简介:这是一套面向微信小程序开发者与淘宝客业务学习者的完整源码包,基于C#.NET MVC与微信小程序前后端分离架构,实现调用阿里妈妈淘宝客API进行优惠券自助搜索与领取。后台采用ASP.NET MVC框架,已内置内容管理、会员、订单、微信… · 2026/9/26 4:54:55
决策树建模实战:从特征选择到剪枝调参与随机森林对比 1. 从一张分类表到一棵树:决策树建模到底在做什么先讲一个我特别常见的场景:业务方甩给你一张客户表,里面有年龄、收入、最近一次消费时间,问你"这些人里哪些会流失?"你没时间调一个神经网络,更不… · 2026/9/26 4:54:49
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍 简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践 一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46