【链表】重排链表,看似复杂实则并不简单~
文章目录
- 143. 重排链表
- 解题思路
143. 重排链表
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->2->3(这道题也可以看作是 1->2,最后合并结果都是一样的),后半部分则是逆序的情况:5->4,此时将它们逐个合并起来就是 1->5->2->4->3 了!
根据上面的解析,我们可以把这道题分为三步来解决:
- 找到链表的中间节点(使用快慢指针就能得到,此时
slow就是中间节点) - 逆序中间节点的右侧链表(可以使用双指针或者头插法,下面再讨论)
- 合并左右两个链表
上面的操作我们都是耳熟能详啦,其中要注意的无非就是第二步,这里介绍 头插法的使用,其实就是引入一个新的头节点 newhead,将右侧链表中的节点逐个头插到 newhead 后面,最后得到一个只有后半部分的逆序链表,而原链表中就剩下前半部分!只不过要注意一些细节,下面我们来讨论一下!(至于双指针的做法,这里就不介绍了,其实相对头插法来说没那么好理解!)
因为链表的个数可以为奇数或者是偶数,所以我们要考虑一下中间节点 slow 是否要包括在头插法和逆序的操作中,所以此时我们使用头插法的时候有两种策略:
-
将中间节点
slow后面的链表进行逆序,包括中间节点slow:-
其实这种情况下无论是链表个数是奇数还是偶数的话,使用头插法的时候都不太好整,因为可能会出现一些
bug,如下图所示:
-
因为我们最后是要将后半部分单独拎出来作为一个逆序链表,但是此时有一个问题,就是
slow前面的节点的next是指向slow的,因为我们要断开左右部分的链接,此时需要将其slow前面的节点的next置为空,不然在后面合并遍历的时候,就会死循环。但问题是这是一个单链表,要找到前面的节点的话势必要重新遍历,时间复杂度就提高了,所以这种包括中间节点的也一起头插和逆序的操作是 不推荐 的,不如使用下面的策略!
-
-
将中间节点
slow后面的链表进行逆序,但 不包括中间节点slow:-
此时这种情况就比较好办了,无论链表的个数是奇数还是偶数,此时中间节点最后都不属于右半部分的,而是属于前半部分的,那么同样两个链表要断开连接的话,就在中间节点
slow断开,这就非常简单了,直接就是一个slow->next = nullptr就解决了,非常的高效和简单!
-
比如举个例子,如下图所示:

-
此外需要注意的细节就是,在进行逆序头插法的时候,需要先记录一下当前节点的下一个节点,防止指向改变后丢失,其它就没有什么大问题了!
解决了第二步,那么第三步就没问题了,就是要将右侧链表的每个节点插入到左侧链表的每个节点中!下面直接给出代码,具体过程可以结合自己画图来分析,都是不难的,只是流程多而已
/*** 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:void reorderList(ListNode* head) {// 1. 找到链表的中间节点ListNode* fast = head;ListNode* slow = head;while(fast != nullptr && fast->next != nullptr){slow = slow->next;fast = fast->next->next;}// 2. 逆序中间节点之后的链表,但不包括中间节点(此时slow就是中间节点)ListNode* newhead = new ListNode(0, nullptr);ListNode* right = slow->next;while(right != nullptr){ListNode* next = right->next; // 先记录下一个节点防止丢失right->next = newhead->next;newhead->next = right;right = next;}// 3. 合并左右两个链表slow->next = nullptr; // 记得要断开左右链表的连接,不然会死循环ListNode* cur1 = head;ListNode* cur2 = newhead->next;while(cur1 != nullptr && cur2 != nullptr){ListNode* next1 = cur1->next;ListNode* next2 = cur2->next;cur1->next = cur2;cur2->next = next1;cur1 = next1;cur2 = next2;}delete newhead; // 别忘了要释放节点}
};
相关文章:
【链表】重排链表,看似复杂实则并不简单~
文章目录 143. 重排链表解题思路 143. 重排链表 143. 重排链表 给定一个单链表 L 的头节点 head ,单链表 L 表示为: L0 → L1 → … → Ln - 1 → Ln 请将其重新排列后变为: L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → … 不能…...
yakit-靶场-高级前端加解密与验签实战(for嵌套纯享版)
高级前端加解密与验签实战 一、前端验证签名(验签)表单:HMAC-SHA256 使用hmac-sha256的十六进制key值可以加密 与页面加密后的值相同 热加载: encryptData func(p) { //sha256key值key codec.DecodeHex("313233343132333…...
洛谷 P1328 [NOIP2014 提高组] 生活大爆炸版石头剪刀布
题解: #include<iostream> #include<vector> //定义二维数组,直接标识不同出法相应对应关系 int mark[5][5]{{0,-1,1,1,-1},{1,0,-1,1,-1},{-1,1,0,-1,1},{-1,-1,1,0,1},{1,1,-1,-1,0}}; void JudgeScore(int A,int B,int& countA,int&…...
NLP论文速读(NeurIPS 2024)|BERT作为生成式上下文学习者BERTs are Generative In-Context Learners
论文速读|BERTs are Generative In-Context Learners 论文信息: 简介: 本文探讨了在自然语言处理(NLP)领域中,上下文学习(in-context learning)的能力,这通常与因果语言模型&#x…...
亚马逊云科技 | Amazon Nova:智能技术新势力
在2024年亚马逊云科技re:invent大会上,Amazon Nova 系列自研生成式 AI 多模态模型重磅登场,新一代的AI产品-Amazon Nova,隶属于 Amazon Bedrock,一共发布6款大模型,精准切入不同领域,解锁多元业务可能&…...
Kali 自动化换源脚本编写与使用
1. 背景与需求 在使用 Kali Linux 的过程中,软件源的配置对系统的更新与软件安装速度至关重要。 Kali 的默认官方源提供了安全且最新的软件包,但有时由于网络条件或地理位置的限制,使用官方源可能会出现速度较慢的问题。 为了解决这一问题&a…...
【已解决】PDF文档有密码怎么办(2024新)免费在线工具PDF2Go
强大的解密工具PDF2Go使用指南 一、PDF2Go简介 PDF2Go是由德国QaamGo公司开发的在线PDF工具箱,以其强大的功能和用户友好的界面而闻名。它不仅免费,而且不需要用户注册或安装任何软件,只需打开浏览器即可使用。 二、功能特点 1. 免费且无需…...
华为ensp-BGP联盟
学习新思想,争做新青年,今天学习BGP联盟 实验介绍 一个BGP联盟是一个具有内部层次结构的AS。一个BGP联盟由若干个子AS 组成,子AS也称为成员AS。对于一个BGP联盟,其成员AS内部的各路由器之间需要建立全互联的IBGP邻居关系或使用B…...
ArcGIS中怎么进行水文分析?(思路介绍)
最近有人咨询,ArcGIS中怎么进行水文分析,大致的说一下河网提取的思路哈 解决思路:dem填洼→计算水流方向→计算水流累积矩阵→形成河网 dem填洼 计算水流方向 计算水流累积矩阵 用栅格计算器,设阈值(自己多次尝试&…...
LabVIEW中实现多个Subpanel独立调用同一个VI
在LabVIEW中,如果需要通过多个Subpanel同时调用同一个VI并让这些VI实例独立运行,可以通过以下方法实现: 1. 问题背景 LabVIEW默认的VI是以单实例方式运行的。当将同一个VI加载到多个Subpanel时,会因为共享同一内存空间而导致冲突…...
【SpringMVC】Bean 加载控制
在实际开发中,SpringMVC 负责扫描和加载 Controller 层的 Bean 对象,而业务层和数据层等其他模块的 Bean 则由 Spring 框架负责扫描和加载。那么,如何控制 Spring 仅加载除了 Controller 层之外的其他 Bean 呢?为了解决这个问题&a…...
Socket编程中关于服务器端监听端口与新连接端口的深入剖析
Socket编程中关于服务器端监听端口与新连接端口的深入剖析 在Socket编程领域,存在一个容易让初学者感到困惑的问题。尽管很多人在网络上进行了相关探讨,但不少解释要么不够清晰明了,要么太过肤浅,未能深入到问题的核心࿰…...
如何通过HTTP API更新Doc
本文介绍如何通过HTTP API更新Collection中已存在的Doc。 说明 若更新Doc时指定id不存在,则本次更新Doc操作无效 如只更新部分属性fields,其他未更新属性fields默认被置为null 前提条件 已创建Cluster:创建Cluster。 已获得API-KEY&#…...
Qt5 中 QGroupBox 标题下沉问题解决
我们设置了QGroupBox 样式之后,发现标题下沉了,那么如何解决呢? QGroupBox {font: 12pt "微软雅黑";color:white;border:1px solid white;border-radius:6px; } 解决后的效果 下面是解决方法: QGroupBox {font: 12pt "微软雅黑";color:white;bo…...
[OpenGL]使用glsl实现smallpt
一、简介 本文介绍了如何使用 OpenGL,使用 glsl 语言在 Fragment shader 中实现 smallpt。程序完成后可以得到以下渲染结果(samples per pixel, spp 16)。在程序中按下A,W可以左右平移,按下W,S可以前后平移: 二、s…...
elementui的默认样式修改
今天用element ui ,做了个消息提示,发现提示的位置总是在上面,如图: 可是我想让提示的位置到下面来,该怎么办? 最后还是看了官方的api 原来有个自定义样式属性 customClass 设置下就好了 js代码 css代码…...
mysql的主从配置
#mysql数据库 #主从 MySQL数据库主从配置 1.MySQL主从介绍 MySQL 主从又叫做 Replication、AB 复制。简单讲就是 A 和 B 两台机器做主 从后,在 A 上写数据,另外一台 B 也会跟着写数据,两者数据实时同步的。 MySQL 主从是基于 binlog 的&…...
CPO-CNN-GRU-Attention、CNN-GRU-Attention、CPO-CNN-GRU、CNN-GRU四模型多变量时序预测对比
CPO-CNN-GRU-Attention、CNN-GRU-Attention、CPO-CNN-GRU、CNN-GRU四模型多变量时序预测对比 目录 CPO-CNN-GRU-Attention、CNN-GRU-Attention、CPO-CNN-GRU、CNN-GRU四模型多变量时序预测对比预测效果基本介绍程序设计参考资料 预测效果 基本介绍 基于CPO-CNN-GRU-Attention、…...
深入了解PINN:物理信息神经网络(Physics-Informed Neural Networks)
1. 什么是PINN(物理信息神经网络)? 物理信息神经网络(PINN,Physics-Informed Neural Networks)是一类通过结合神经网络和物理方程的深度学习方法。其主要特点是将物理系统的约束条件(如偏微分方…...
人形机器人全身运动规划相关资料与文章
1.HumanPlus: Humanoid Shadowing and Imitation from Humans 文章地址:[2406.10454] HumanPlus: Humanoid Shadowing and Imitation from Humans 代码地址:MarkFzp/humanplus: [CoRL 2024] HumanPlus: Humanoid Shadowing and Imitation from Humans …...
Path of Building:流放之路玩家的离线构建规划神器,5步打造完美角色
Path of Building:流放之路玩家的离线构建规划神器,5步打造完美角色 【免费下载链接】PathOfBuilding Offline build planner for Path of Exile. 项目地址: https://gitcode.com/GitHub_Trending/pa/PathOfBuilding Path of Building(…...
GIL已死,但并发更难?——Python无锁环境下的竞态漏洞高发清单(附12个生产级检测脚本)
第一章:GIL消亡后的Python并发新纪元随着CPython 3.13正式移除全局解释器锁(GIL)的实验性支持,以及3.14中GIL的彻底移除,Python终于迈入真正的原生多核并发时代。这一变革并非简单地“去掉一把锁”,而是重构…...
2026加密算法全景解析:从原理到实战,一文读懂加密的核心逻辑
在数字化时代,数据就是核心资产——从手机支付的交易信息、社交软件的私密聊天,到企业的客户数据、政府的敏感文件,每一份数据的安全都离不开加密算法的守护。我们每天都在接触加密:打开HTTPS网页、登录账号、传输文件,…...
VSG阻抗扫描实战:从建模仿真到扫频验证
VSG 扫频法 阻抗扫描 阻抗建模验证 正负序阻抗 持续 更新 迭代 新能源 变流器 逆变器 虚拟同步控制 VSG 复现 基于序阻抗的虚拟同步机同步频率谐振现象 可设置扫描范围、扫描点数 程序附带注释,每一行都能看懂 包括 vsg仿真模型,阻抗建模程序࿰…...
IDEA中Module工程重命名的正确姿势与避坑指南
1. 为什么需要重命名Module工程? 在IntelliJ IDEA中开发多模块项目时,Module命名往往不是一蹴而就的。我遇到过很多次这样的情况:项目初期随便起了个module名字,随着业务发展发现名称与实际功能严重不符。比如有个数据分析项目&a…...
AI辅助开发:让快马AI帮你智能分析和重构代码,解决顽固的rate limit exceeded问题
AI辅助开发:让快马AI帮你智能分析和重构代码,解决顽固的rate limit exceeded问题 最近在做一个数据采集项目时,遇到了让人头疼的rate limit exceeded问题。每次运行到一半就被API限制打断,数据不完整还得手动重跑。好在发现了Ins…...
如何快速在浏览器中搭建全功能Office办公环境:SE Office扩展终极指南
如何快速在浏览器中搭建全功能Office办公环境:SE Office扩展终极指南 【免费下载链接】se-office se-office扩展,提供基于开放标准的全功能办公生产力套件,基于浏览器预览和编辑office。 项目地址: https://gitcode.com/gh_mirrors/se/se-o…...
Comsol弱形式求解三维光子晶体能带:快速而精确的模拟方法探索光子晶体的局域化光学行为
Comsol弱形式求解三维光子晶体能带。深夜两点盯着屏幕上扭曲的能带曲线,突然意识到三维光子晶体的数值模拟就像在量子迷宫里玩俄罗斯方块——每个晶格参数都可能让整个能带结构瞬间崩塌。传统界面操作总让我感觉戴着镣铐跳舞,直到某天偶然翻到COMSOL的弱…...
手把手教你用Burp Suite搞定PortSwigger Labs的CSRF靶场(附12个Lab实战POC)
Burp Suite实战指南:12种CSRF漏洞攻防演练 在Web安全领域,CSRF(跨站请求伪造)始终是排名前五的高危漏洞类型。PortSwigger Labs作为全球知名的Web安全实战平台,其CSRF靶场设计了12个由浅入深的实验场景。本文将带你使用…...
NAS不只是存文件!极空间Docker部署汉化游戏全攻略(含避坑技巧)
极空间NAS变身游戏主机:Docker部署汉化游戏的完整实践指南 你是否曾想过,那台安静躺在角落里的NAS设备,除了存储照片和电影外,还能摇身一变成为你的私人游戏服务器?极空间NAS凭借其出色的硬件性能和友好的操作界面&…...
