news 2026/4/15 13:32:22

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/4/14 13:11:51

从零开始玩转PaddleOCR-VL-WEB:Jupyter一键启动教程

从零开始玩转PaddleOCR-VL-WEB&#xff1a;Jupyter一键启动教程 1. 简介与学习目标 PaddleOCR-VL-WEB 是基于百度开源的 PaddleOCR-VL 技术构建的一款高效、多语言支持的文档解析系统。该模型融合了动态分辨率视觉编码器与轻量级语言模型&#xff0c;能够在低资源消耗下实现对…

作者头像 李华
网站建设 2026/4/13 15:48:05

YOLO-v5实战应用:港口集装箱编号识别系统

YOLO-v5实战应用&#xff1a;港口集装箱编号识别系统 1. 引言 1.1 业务场景描述 在现代港口物流管理中&#xff0c;集装箱的高效调度与追踪是保障运输效率的核心环节。传统的人工登记方式不仅耗时耗力&#xff0c;还容易因视觉疲劳或环境干扰导致编号识别错误。随着计算机视…

作者头像 李华
网站建设 2026/4/15 10:45:52

边缘计算新选择:Qwen2.5-0.5B开源模型部署趋势一文详解

边缘计算新选择&#xff1a;Qwen2.5-0.5B开源模型部署趋势一文详解 1. 引言&#xff1a;轻量级大模型在边缘计算中的崛起 随着人工智能应用向终端侧延伸&#xff0c;边缘计算场景对轻量、高效、低延迟的AI推理能力提出了更高要求。传统大模型依赖高性能GPU集群&#xff0c;在…

作者头像 李华
网站建设 2026/4/6 5:52:40

BGE-M3混合检索实战:从部署到业务落地全解析

BGE-M3混合检索实战&#xff1a;从部署到业务落地全解析 1. 引言&#xff1a;为什么需要BGE-M3&#xff1f; 在当前信息爆炸的时代&#xff0c;传统关键词匹配的搜索方式已难以满足复杂语义理解的需求。尤其是在多语言、长文档和跨模态场景下&#xff0c;单一模式的检索模型往…

作者头像 李华
网站建设 2026/4/12 3:13:51

TurboDiffusion硬件选型指南:RTX 5090 vs H100成本效益分析

TurboDiffusion硬件选型指南&#xff1a;RTX 5090 vs H100成本效益分析 1. 引言&#xff1a;TurboDiffusion带来的视频生成革命 1.1 技术背景与行业痛点 传统扩散模型在视频生成任务中面临严重的效率瓶颈。以标准Stable Video Diffusion为例&#xff0c;生成一段5秒720p视频…

作者头像 李华
网站建设 2026/4/8 21:50:14

U-Net架构优势解析:cv_unet_image-matting技术原理揭秘

U-Net架构优势解析&#xff1a;cv_unet_image-matting技术原理揭秘 1. 引言&#xff1a;图像抠图的技术演进与U-Net的崛起 随着计算机视觉技术的发展&#xff0c;图像抠图&#xff08;Image Matting&#xff09;作为一项精细的像素级分割任务&#xff0c;在影视后期、电商展示…

作者头像 李华