Leetcode——链表:143.重排链表

embedded/2025/1/21 16:29:58/

题目

 

思路

首先考虑特殊情况,链表为空,或者链表只有一个元素,此时直接返回

找到中间位置,将后半部分的链表翻转,得到新链表,将后半部分链表的节点交替插入原链表

寻找链表中间节点

使用快慢指针法

设置一个快指针,一个慢指针,初始均指向链表头节点

慢指针一次向后移动一个节点,快指针一次向后移动两个节点

当快指针移动到结尾时,慢指针指向前半条链表的最后一个节点

设置一个中间节点,中间节点为慢指针的下一个

断开前后两部分链表,慢指针的下一个指向空

原地翻转链表

设置三个变量prev,curr,next

设置循环处理全部链表中的节点,将当前元素的后继改为原链表的前驱(此时当前元素与原链表的后继断开,造成后继链表中全部节点丢失)

更新三个变量,处理下一个节点,将当前元素变为prev,将next改为当前元素,将next向后移动一个节点

当移动到最后一个元素时,把当前节点直接插入到原链表的头,更新并返回新链表的头

合并两个链表

设置新链表的尾指针,初始值设为指向第一个链表的头节点

将第一条链表的头指针设为链表中的第二个节点

先将第二个链表的头节点插入第一个链表中,尾向后移动,第二个链表的头节点向后移动

将第一个链表的第二个节点连接到尾后,尾向后移动,第一个节点指针向后移动

代码

寻找链表中间节点

传入值:链表头节点

传出值:后半部分链表的头节点

ListNode* midList(ListNode* head){ListNode* fast=head;ListNode* slow=head;while(fast->next!=nullptr&&fast->next->next!=nullptr){fast=fast->next->next;slow=slow->next;}ListNode* MidNode=slow->next;slow->next=nullptr;return MidNode;}

原地翻转链表

传入值:链表头节点

传出值:新链表头节点

ListNode* reverseList(ListNode* head){ListNode* prev=nullptr;ListNode* curr=head;ListNode* next=curr->next;while(next!=nullptr){curr->next=prev;prev=curr;curr=next;next=next->next;}curr->next=prev;prev=curr;return prev;}

交替合并两个链表

void mergeList(ListNode* list1_head,ListNode* list2_head){ListNode* newListTail=list1_head;list1_head=list1_head->next;while(list1_head!=nullptr&&list2_head!=nullptr){newListTail->next=list2_head;newListTail=newListTail->next;list2_head=list2_head->next;newListTail->next=list1_head;newListTail=newListTail->next;list1_head=list1_head->next;}newListTail->next=list2_head;}

主函数

void reorderList(ListNode* head) {if(head==nullptr||head->next==nullptr)return;ListNode* secondList=midList(head);secondList=reverseList(secondList);mergeList(head,secondList);}

http://www.ppmy.cn/embedded/155817.html

相关文章

文档解析:PDF里的复杂表格、少线表格如何还原?

PDF中的复杂表格或少线表格还原通常需要借助专业的工具或在线服务,以下是一些可行的方法: 方法一:使用在线PDF转换工具 方法二:使用桌面PDF编辑软件 方法三:通过OCR技术提取表格 方法四:手动重建表格 …

【开源免费】基于Vue和SpringBoot的夕阳红公寓管理系统(附论文)

本文项目编号 T 146 ,文末自助获取源码 \color{red}{T146,文末自助获取源码} T146,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

Centos 8 交换空间管理

新增swap 要增加 Linux 系统的交换空间,可以按照以下步骤操作: 1. 创建一个交换文件 首先,选择文件路径和大小(例如,增加 1 GB 交换空间)。 sudo fallocate -l 1G /swapfile如果 fallocate 不可用&…

聚类问题(K-means,系统聚类,SBSCAN算法)

K-means算法 大概的流程 优缺点 步骤 例题:根据消费习惯来对省份进行分类 下面是spss的实操 系统/层次聚类 原理 步骤(以凝聚式聚类为例) 聚类分析需要注意的问题 类型 下面是spss操作 补充: ​编辑 优缺点 DBSCAN算…

npm配置electron专属的淘宝镜像进行安装

nodejs的版本是22.13 npm配置electron专用的淘宝镜像,不配置会下载很慢 npm config edit在打开的文本编辑框里,在最下面空白的地方填写下面的信息 registryhttps://registry.npmmirror.com electron_mirrorhttps://cdn.npmmirror.com/binaries/electr…

ubuntu22.04编译多个版本OpenCV

按照本文方法可以实现ubuntu22.04上面同时存在OpenCV4.5.5和OpenCV4.9.0。方法其实是按照正常的流程就可以,参照这个:ubuntu18.04openc4.5.5contrib 4.5.5编译_ubuntu18 anzhuang opencv4.5.5-CSDN博客 需要修改的地方是在第6步“保存path,方…

java微服务中消息队列处理中间件基础语法学习,零基础学习

在 Java 微服务中,消息队列处理中间件可以帮助实现服务之间的异步通信、解耦和负载均衡。常用的 Java 消息队列工具包括 RabbitMQ、Apache Kafka 和 ActiveMQ。下面我将详细介绍这些消息队列工具在 Java 中的基础语法和使用方法。 1. RabbitMQ RabbitMQ 是一个广泛…

TryHackMe - Linux - Mountaineer

Mountaineer 6w$的事情出现了反转,目前还没有最新消息,后面差不多了再出后续,不管怎样我们都是罐菌,恭喜张云彬拿下2024 QQ飞车年度总决赛冠军🏆 最近换了MacBook Pro,玩几台靶机找找手感,mac…