首页/新闻资讯/正文详情

C++实现LeetCode(143.链表重排序)

发布时间:2026/11/6 9:09:43 来源:云帆数科 栏目:资讯中心
C++实现LeetCode(143.链表重排序)
前言LeetCode 第 143 题「重排链表」Reorder List要求把链表L0 → L1 → … → Ln-1 → Ln原地重排为L0 → Ln → L1 → Ln-1 → L2 → Ln-2 → …。题目通常附加一条限制不能只修改节点的值必须真正改变节点的连接关系。这条限制决定了做法。如果允许改值可以把所有值收集到数组里按目标顺序写回节点简单直接但题目要的是指针操作必须把链表「拆开、反转、交错合并」。常见误解是直接用一个数组存节点指针再重连这虽然也改变了连接关系但额外用了 O(n) 空间题目进阶要求 O(1) 额外空间标准解法是「找中点、反转后半、合并两半」。另一个常见错误是找中点后忘记把前半的尾部next置空导致两半仍然相连反转后半时就会把前半也卷进去形成环最后死循环。本文按三步拆解并逐行说明指针顺序。一、把目标拆成三步目标序列可以看成两部分交错前半段L0, L1, L2, …从前往后。后半段Ln, Ln-1, Ln-2, …从后往前。重排就是把后半段反转然后与前半段一个隔一个地合并。于是任务分解为找到链表中点把链表切成两半。反转后半段。把两半交替合并。三步都是链表的基本操作但组合时边界很多节点数为奇数时前半比后半多一个节点数为偶数时两半等长只有一个节点时直接返回合并时不能丢掉任何一截。时间复杂度 O(n)找中点走一遍反转走一遍合并走一遍。空间复杂度 O(1)只用了几个指针。二、找中点与切分用快慢指针找中点slow每次走一步fast每次走两步。循环条件是fast-next ! nullptr fast-next-next ! nullptr。这个条件让slow最终停在「前半段的最后一个节点」n 为奇数例如 5 个节点slow停在下标 2中间节点前半是 0..2后半是 3..4。n 为偶数例如 4 个节点slow停在下标 1前半是 0..1后半是 2..3。无论奇偶后半段长度都不超过前半段这为后面的合并循环提供了便利。找到中点后先保存second slow-next再执行slow-next nullptr。这一步是切分必须做。若不切前半的尾节点仍然指向后半的头反转后半时会沿着这条边把前半也串进来合并时两半互相指向很快形成环程序可能陷入死循环或输出错乱。切分后前半以head开头、slow结尾后半以second开头。此时两条链表互不相连。三、反转后半与交替合并反转用三指针prev、cur、next。每次先保存cur-next再让cur-next prev然后推进prev和cur。循环结束时prev是反转后的头。这部分与普通链表反转完全相同注意不要先改cur-next再保存后继。合并时first指向前半当前节点second指向后半当前节点。每一轮保存firstNext first-next。保存secondNext second-next。first-next second;second-next firstNext;first firstNext;second secondNext;循环条件是second ! nullptr。因为后半不长于前半后半走完时前半要么刚好走完要么还剩最后一个节点这个节点已经在前一轮被second-next firstNext接上不需要额外处理。若循环条件写成first ! nullptr second ! nullptr当后半先空时也能退出但若前半先空理论上不会因为后半不长于前半就会解引用空指针。用second作为条件最稳。第 1、2 步的保存不能省。第 3 步会覆盖first-next第 4 步会覆盖second-next如果不提前保存下一轮就找不到两条链表的后续节点链表会被截断。四、完整实现// 适用于 C17#include iostreamstruct ListNode {int val;ListNode* next;ListNode() : val(0), next(nullptr) {}ListNode(int x) : val(x), next(nullptr) {}ListNode(int x, ListNode* next) : val(x), next(next) {}};void reorderList(ListNode* head) {if (head nullptr || head-next nullptr) {return;}// 1. 快慢指针找中点slow 停在前半的最后一个节点ListNode* slow head;ListNode* fast head;while (fast-next ! nullptr fast-next-next ! nullptr) {slow slow-next;fast fast-next-next;}// 2. 切分并反转后半ListNode* second slow-next;slow-next nullptr;ListNode* prev nullptr;while (second ! nullptr) {ListNode* next second-next;second-next prev;prev second;second next;}second prev;// 3. 交替合并两半ListNode* first head;while (second ! nullptr) {ListNode* firstNext first-next;ListNode* secondNext second-next;first-next second;second-next firstNext;first firstNext;second secondNext;}}void printList(const ListNode* head) {for (const ListNode* p head; p ! nullptr; p p-next) {std::cout p-val ;}std::cout \n;}int main() {ListNode* head new ListNode(1);head-next new ListNode(2);head-next-next new ListNode(3);head-next-next-next new ListNode(4);head-next-next-next-next new ListNode(5);reorderList(head);printList(head); // 按定义应为 1 5 2 4 3while (head ! nullptr) {ListNode* next head-next;delete head;head next;}return 0;}以 1、2、3、4、5 为例slow停在中点 3前半是 1→2→3后半是 4→5反转后变成 5→4合并得到 1→5→2→4→3。若节点数是 4前半 1→2后半 3→4反转后 4→3合并得到 1→4→2→3也符合「首、尾、次首、次尾」的规律。main里手动new了五个节点最后逐个delete是为了演示完整的所有权LeetCode 的判题环境会统一回收不需要在函数里释放。真实工程中更推荐用std::unique_ptr管理节点或在reorderList之外用容器持有节点。常见坑点1. 只交换节点的值❌ 用数组收集值再按目标顺序写回val。✅ 题目要求改变连接关系按「找中点、反转、合并」操作指针。2. 忘记切断两半❌ 找到中点后直接反转slow-next开始的链表不置空slow-next。✅second slow-next; slow-next nullptr;再反转。3. 反转时先改指针再保存后继❌cur-next prev; next cur-next;next拿到的是prev。✅ 先next cur-next;再改指向。4. 合并时丢失后半的后续❌ 只保存firstNext不保存secondNextsecond-next被覆盖后找不到下一段。✅ 两个next都要在覆盖前保存。5. 合并循环条件写错❌while (first ! nullptr)前半走完后解引用空指针。✅while (second ! nullptr)后半不长于前半天然安全。6. 中点条件写成fast ! nullptr fast-next ! nullptr❌slow停在中间偏右后半长度可能大于前半合并时前半先空。✅ 用fast-next ! nullptr fast-next-next ! nullptr让slow停在前半末尾。7. 空表或单节点没处理❌ 直接进入找中点head-next为空时仍访问head-next-next。✅ 入口判断head nullptr || head-next nullptr直接返回。8. 认为必须新建节点❌ 为每个值new ListNode再拼接。✅ 原地改next空间 O(1)不新建节点。总结步骤操作关键点找中点快慢指针slow停在前半末尾切分slow-next nullptr必须断开防止成环反转后半三指针先存后继再改指向合并交替接链保存两个next时间O(n)三遍扫描空间O(1)只用指针边界空表、单节点直接返回链表重排序的解法可以背成三句话快慢指针找中点并切断反转后半交替合并。真正容易出错的是「切断」和「保存后继」这两个动作——它们不改变算法框架却决定了链表会不会成环、会不会丢节点。把这两处写对奇偶长度的差异就会被循环条件自然吸收。

相关推荐

具身智能技术解析:从多模态感知到商业化落地
具身智能技术解析:从多模态感知到商业化落地

1. 项目背景与行业定位 "魔法原子"这个命名本身就充满想象力,它让我联想到科幻作品中那些能够重构物质的基础单元。而105亿这个数字,在当前具身智能领域的融资规模中确实属于头部梯队。具身智能(Embodied AI)作为AI发展… · 2026/11/6 9:09:43

libcurl Windows静态库:VS一键集成HTTP/HTTPS通信
libcurl Windows静态库:VS一键集成HTTP/HTTPS通信

简介:本资源是面向Windows平台C/C开发者的libcurl 7.40预编译二进制包,专为快速集成HTTP/HTTPS网络通信能力而设计,适用于各类VS版本(如VS2013及以上)的项目开发,无需自行编译即可直接调用。压缩包共17个文… · 2026/11/6 9:08:42

Flink RichSourceFunction 设计与优化实战
Flink RichSourceFunction 设计与优化实战

1. 项目概述 在实时数据处理领域,Apache Flink 已经成为事实上的标准框架之一。作为 Flink 的核心组件,SourceFunction 承担着数据摄入的关键角色。而 RichSourceFunction 作为其增强版本,提供了更丰富的生命周期管理和上下文访问能力。本文将… · 2026/11/6 9:08:42

企业元宇宙治理框架:技术实现与合规路径
企业元宇宙治理框架:技术实现与合规路径

1. 企业元宇宙治理框架的核心逻辑 企业元宇宙作为数字化转型的新阶段,其治理框架需要兼顾技术创新与合规要求。从技术架构角度看,企业元宇宙本质上是一个由数字孪生、区块链、人工智能等技术构成的复杂系统。这个系统需要解决三个核心问题:如… · 2026/11/6 14:59:51

基于CDC的MySQL实时数据同步方案实践
基于CDC的MySQL实时数据同步方案实践

1. 项目背景与核心价值 在数据驱动的业务场景中,数据库表间数据同步是个高频需求。我最近在电商订单系统中就遇到了这个问题:订单主表数据变更后,需要实时同步到统计分析表和风控表。传统的手动同步或定时任务方式存在延迟高、易出错的问题&a… · 2026/11/6 14:00:34

JSP农贸交易系统开发与智能撮合算法实践
JSP农贸交易系统开发与智能撮合算法实践

## 1. 项目概述与核心价值农贸产品交易系统是连接农产品生产端与消费端的重要数字化桥梁。这个基于JSP技术的交易平台(项目编号g3608)完整包含了程序源码、数据库设计、部署指南和开发环境配置,是一套开箱即用的农产品B2B解决方案。我在参与某… · 2026/11/6 14:00:34

2025年3D建模工具选型实战指南:按工作流断点匹配生产力
2025年3D建模工具选型实战指南:按工作流断点匹配生产力

1. 这不是选软件,是选你未来三年的“数字手”——为什么2025年建模工具选择比以往任何时候都更关键 2025年做3D建模,你面对的早已不是“用哪个软件画个模型”这么简单的事。它直接决定你能不能接单、能不能按时交付、能不能把想法一秒变现实、甚至决定你… · 2026/11/6 14:00:34

Qt飞机大战源码解析:QGraphicsView游戏循环与碰撞检测实战
Qt飞机大战源码解析:QGraphicsView游戏循环与碰撞检测实战

简介:这份资源是面向Qt初学者与游戏开发入门者的「飞机大战」完整项目源码包,围绕Qt框架在经典空战游戏中的实际应用展开,可用于课程设计、自学练手或二次开发参考。压缩包共223个文件,约6.21MB,以105个C头文件与32个c… · 2026/11/6 14:00:34

老旧CMS的XSS与getshell风险防护及应急治理
老旧CMS的XSS与getshell风险防护及应急治理

项目中遇到过不少次类似的场面:群里忽然冒出一条消息,标题写得耸人听闻,核心关键词是 XSS 、 0day 、 通杀所有版本 ,还带着一个"可 getshell"的尾巴,配图往往是半个命令行窗口。消息传得飞快&#xf… · 2026/11/6 13:56:30

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:27:59

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:03

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 10:29:23

三菱PLC数据采集到数据库的时序设计:Python+MC协议实战
三菱PLC数据采集到数据库的时序设计:Python+MC协议实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 1:02:11

ASIC主模式RTL设计:状态机与三态驱动的流片级实现
ASIC主模式RTL设计:状态机与三态驱动的流片级实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 1:02:11

STM32嵌入式C++开发:GDB调试与Renode仿真实战指南
STM32嵌入式C++开发:GDB调试与Renode仿真实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 1:02:11

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:27:59

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:03

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 10:29:23

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码