news 2026/8/16 14:59:25

day136—快慢指针—重排链表(LeetCode-143)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
day136—快慢指针—重排链表(LeetCode-143)

题目描述

给定一个单链表L的头节点head,单链表L表示为:

L0 → L1 → … → Ln - 1 → Ln

请将其重新排列后变为:

L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …

不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

示例 1:

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

示例 2:

输入:head = [1,2,3,4,5]输出:[1,5,2,4,3]

提示:

  • 链表的长度范围为[1, 5 * 104]
  • 1 <= node.val <= 1000

解决方案:

这段代码的核心功能是重排单链表(将链表调整为「原链表前半部分节点 + 后半部分反转后的节点」交替拼接的形式,比如原链表 1→2→3→4→5 变为 1→5→2→4→3,1→2→3→4 变为 1→4→2→3),通过「找中点 + 反转后半段 + 交替拼接」三步实现,时间复杂度O(n)、空间复杂度O(1),是该问题的最优解法。

核心逻辑

代码整合了 “找链表中点”“反转链表” 两个基础操作,再通过双指针交替拼接完成重排,全程无额外空间开销:

  1. 第一步:找链表中点:调用midNode函数(快慢指针法)找到链表中间节点mid,将原链表拆分为前半段(head开头)和后半段(mid开头);
  2. 第二步:反转后半段:调用reverseNode函数反转后半段链表,得到反转后的后半段头节点head2
  3. 第三步:交替拼接:用两个指针分别遍历前半段和反转后的后半段,逐个将后半段节点插入前半段节点之间,直到后半段只剩最后一个节点(避免链表成环),完成重排。

总结

  1. 核心思路:将重排问题拆解为 “找中点拆分 + 反转后半段 + 交替拼接” 三个基础链表操作,化繁为简;
  2. 关键细节:拼接时循环条件为head2->next(而非head2),避免最后拼接导致链表闭环;
  3. 效率优势:三步操作均为一次遍历,整体时间O(n)、空间O(1),是重排链表的最优解法。

函数源码:

/** * Definition for singly-linked list. * struct 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) {} * }; */ class Solution { public: //找中间结点——快慢指针 ListNode* midNode(ListNode* head){ ListNode* slow=head; ListNode* fast=head; while(fast && fast->next){ slow=slow->next; fast=fast->next->next; } return slow; } //反转链表 ListNode* reverseNode(ListNode* head){ ListNode* pre=nullptr; ListNode* cur=head; ListNode* nxt=nullptr; while(cur){ nxt=cur->next; cur->next=pre; pre=cur; cur=nxt; } return pre; } void reorderList(ListNode* head) { ListNode* mid =midNode(head); ListNode* head2=reverseNode(mid); ListNode* nxt=nullptr; ListNode* nxt2=nullptr; while(head2->next){ nxt=head->next; nxt2=head2->next; head->next=head2; head2->next=nxt; head=nxt; head2=nxt2; } } };
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/15 21:38:19

RexUniNLU金融领域实战:财报关键信息抽取

RexUniNLU金融领域实战&#xff1a;财报关键信息抽取 1. 引言 在金融分析与投资决策中&#xff0c;上市公司发布的财务报告是获取企业经营状况的核心来源。然而&#xff0c;财报文本通常篇幅长、结构复杂、专业术语密集&#xff0c;传统人工提取方式效率低且易出错。如何从非…

作者头像 李华
网站建设 2026/8/15 21:07:53

MGeo地址标准化预处理:文本清洗与格式统一最佳实践

MGeo地址标准化预处理&#xff1a;文本清洗与格式统一最佳实践 在中文地址数据处理中&#xff0c;由于书写习惯、缩写方式、语序差异等因素&#xff0c;同一地理位置常以多种文本形式存在。例如&#xff0c;“北京市朝阳区建国门外大街1号”可能被记录为“北京朝阳建国门外大街…

作者头像 李华
网站建设 2026/8/6 9:41:52

Qwen儿童动物生成器部署教程:3步搞定可爱风图片创作

Qwen儿童动物生成器部署教程&#xff1a;3步搞定可爱风图片创作 1. 引言 1.1 学习目标 本文将带你从零开始&#xff0c;快速部署并使用「Cute_Animal_For_Kids_Qwen_Image」——一个基于阿里通义千问大模型打造的专为儿童设计的可爱风格动物图像生成工具。通过本教程&#x…

作者头像 李华
网站建设 2026/8/7 0:03:32

FRCRN语音降噪镜像发布|16kHz单通道高效处理方案

FRCRN语音降噪镜像发布&#xff5c;16kHz单通道高效处理方案 1. 引言&#xff1a;面向实际场景的轻量级语音增强方案 在语音交互、远程会议、录音转写等应用中&#xff0c;环境噪声常常严重影响语音质量。尤其是在非理想录音条件下&#xff08;如家庭办公、户外采集&#xff…

作者头像 李华
网站建设 2026/8/16 7:51:04

MGeo一文详解:中文地址模糊匹配的技术挑战与突破

MGeo一文详解&#xff1a;中文地址模糊匹配的技术挑战与突破 1. 引言&#xff1a;中文地址匹配的现实困境与技术演进 在电商、物流、城市治理和位置服务等场景中&#xff0c;地址数据的标准化与对齐是数据融合的关键环节。然而&#xff0c;中文地址具有高度的非结构化特征——…

作者头像 李华
网站建设 2026/8/8 2:08:58

IndexTTS 2.0新手教程:上传音频+文字生成语音全过程

IndexTTS 2.0新手教程&#xff1a;上传音频文字生成语音全过程 1. 引言&#xff1a;为什么选择IndexTTS 2.0&#xff1f; 还在为找不到贴合人设的配音发愁&#xff1f;试试 B 站开源的 IndexTTS 2.0&#xff01;这款自回归零样本语音合成模型&#xff0c;支持上传人物音频与文…

作者头像 李华