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

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; } } };
http://www.jsqmd.com/news/255405/

相关文章:

  • YOLO11野生动物保护:红外相机+云端AI全天候监测
  • 外语文件扫描翻译一条龙:AI云端处理省钱方案
  • YOLO-v5实战应用:港口集装箱编号识别系统
  • 科哥镜像开源免费,保留版权即可自由使用
  • 跨语言配音黑科技:如何用预装环境实现中英双语情感语音
  • es安装实战:多节点集群配置详细教程
  • 照片转油画总失败?AI印象派艺术工坊免模型部署案例详解
  • NewBie-image-Exp0.1性能优化:多GPU并行生成的配置方法
  • AutoGLM-Phone-9B极速体验:1块钱测试AI手机自动化
  • ComfyUI自动化脚本:定时生成省时80%
  • MGeo地址标准化预处理:文本清洗与格式统一最佳实践
  • YOLO-v8.3部署避坑指南:权限问题与路径错误解决方案
  • Arduino Nano下载问题全解析:驱动与端口配置实战
  • Z-Image保姆级入门:5分钟云端部署,小白也能玩转AI生图
  • 怕CUDA版本错?GPT-OSS云端镜像自动适配,0配置
  • 电商直播新玩法:用Live Avatar打造24小时在线数字人
  • 语音合成API设计:基于Voice Sculptor的最佳实践
  • RexUniNLU金融领域实战:财报关键信息抽取
  • 论文党必备:GTE相似度计算避坑指南,校园网也能跑
  • Z-Image-Turbo实战教程:木质桌面材质表现的细节增强方法
  • 无头模式实践:Chrome Driver项目应用示例
  • 从零开始玩转PaddleOCR-VL-WEB:Jupyter一键启动教程
  • 玩转YOLOv5:2块钱体验完整训练+推理全流程
  • 手把手教你用Qwen3-VL-2B实现智能客服图文问答
  • YOLOv9结果保存路径:runs/detect输出目录说明
  • 麦橘超然vs Automatic1111:资源占用与响应速度对比
  • 部署麦橘超然后,我终于搞懂AI绘画怎么玩
  • 边缘计算新选择:Qwen2.5-0.5B开源模型部署趋势一文详解
  • 通义千问Embedding模型推理慢?vLLM加速部署实战提升300%
  • docker部署数据中台系统DataCap