[LeetCode]143.重排链表

143. 重排链表 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/reorder-list/description/

题目

 示例

 

 解题思路

 寻找链表中点 + 链表逆序 + 合并链表

注意到目标链表即为将原链表的左半端和反转后的右半端合并后的结果。

这样我们的任务即可划分为三步:

找到原链表的中点(参考 876. 链表的中间结点 - 力扣(LeetCode))。

我们可以使用快慢指针来 O(N) 地找到链表的中间节点。
将原链表的右半端反转(参考 206. 反转链表 - 力扣(LeetCode))。

我们可以使用迭代法实现链表的反转。
将原链表的两端合并(参考 21. 合并两个有序链表 - 力扣(LeetCode))

因为两链表长度相差不超过 1,因此直接合并即可。

代码

class Solution {
public:
    void reorderList(ListNode* head) 
    {
        //处理边界情况
        if(head==nullptr || head->next==nullptr || head->next->next==nullptr) return;

        //找到链表的中间节点---快慢指针
        ListNode* fast=head,*slow=head;
        while(fast&&fast->next)
        {
            fast=fast->next->next;
            slow=slow->next;
        }

        //2.把slow后面部分逆序
        ListNode* head2=new ListNode(0);//虚拟头节点,方便头插
        ListNode* cur=slow->next;
        ListNode* next=cur;
        slow->next=nullptr;//注意把两个链表断开
        while(cur)
        {
            next=cur->next;
            cur->next=head2->next;//用next保存后,断开该节点原来和后面的链接,连上逆序后的最后一位节点
            head2->next=cur;
            cur=next;
        }

        //3.合并两个链表
        ListNode* ret=new ListNode(0);
        ListNode* pre=ret;
        ListNode* cur1=head,*cur2=head2->next;//head2是虚拟头节点

        while(cur1)
        {
            pre->next=cur1;
            pre=pre->next;
            cur1=cur1->next;

            if(cur2)
            {
                pre->next=cur2;
                pre=pre->next;
                cur2=cur2->next;
            }
        }
        delete head2;
        delete ret;
    }
};

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/417700.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Git命令操作

什么是Git? Git是⼀个免费的,开源的分布式版本控制软件系统 git区域 存储区域:Git软件⽤于存储资源得区域。⼀般指得就是.git⽂件夹 ⼯作区域:Git软件对外提供资源得区域,此区域可⼈⼯对资源进⾏处理。 暂存区&am…

安卓开发1- android stdio环境搭建

安卓开发1-android stdio环境搭建 Jdk环境搭建 1. 准备Jdk,这边已经准备好了jdk1.8.0,该文件直接使用即可 2. 系统变量添加 %JAVA_HOME%\bin JAVA_HOME 3. 系统变量,Path路径添加 4. 添加完成后,输入命令javac / java -version,验证环…

Sora技术原理解析

1.Sora简介 Sora是一个基于大规模训练的文本控制视频生成扩散模型。 Sora能够生成高达1分钟的高清视频,涵盖广泛的视觉数据类型和分辨率。 Sora使用简单的文本描述,使得视频创作变得前所未有的简单和高效。 Sora的一些能力: Text-to-video…

西软云XMS operate XXE漏洞

免责声明:文章来源互联网收集整理,请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该…

Qt篇——QTableWidget选中多行右键删除

效果如图: 代码如下: 头文件中: QTableWidgetItem *selectedItem; //表格被选中的一行 QMenu* originDataTableContextMenu; //表格右键菜单 QAction* originDataTableActionDel; //表格右键菜单…

腾讯云又双叕降价,云服务器配置优惠价格表2024新版报价

腾讯云服务器多少钱一年?62元一年起,2核2G3M配置,腾讯云2核4G5M轻量应用服务器218元一年、756元3年,4核16G12M服务器32元1个月、312元一年,8核32G22M服务器115元1个月、345元3个月,腾讯云服务器网txyfwq.co…

分组背包(相关解析及例题)

1.概念 分组背包: 分组背包就是有n组物品,每组物品中只可以选择一个物品。 每个物品都有体积和价值,求总体积不超过m的情况下的价值最大值。 那么我们就可以通过概念来得到状态转移方程: dp[ j ]max(dp[ j ],dp[ j -w[ i ][ …

打造透明银行存储:Solidity智能合约的实践与探索

引言: 随着区块链技术的快速发展,智能合约作为其中的核心组件,正被越来越多地应用于各种场景。作为智能合约的编程语言,Solidity因其对以太坊平台的深度支持而备受关注。在这篇文章中,我们将通过构建一个透明的银行存储…

RT-Thread+ENV+MDK+STM32CubeMX适配

前言 (1)如果有嵌入式企业需要招聘湖南区域日常实习生,任何区域的暑假Linux驱动/单片机/RTOS的实习岗位,可C站直接私聊,或者邮件:zhangyixu02gmail.com,此消息至2025年1月1日前均有效 &#xff…

45、WEB攻防——通用漏洞PHP反序列化POP链构造魔术方法原生类

文章目录 序列化:将java、php等代码中的对象转化为数组或字符串等格式。代表函数serialize(),将一个对象转换成一个字符;反序列化:将数组或字符串等格式还成对象。代表函数unserialize(),将字符串还原成一个对象。 P…

基于ESP32的MicroPython项目量产烧写指南

背景 前段时间用MicroPython开发了一个项目,硬件是ESP32-C3,目前准备量产,我需要提供固件以供加工厂批量烧录,需要把我有程序的板子里的程序读出来,然后下到别的板子上,以下做这件事情的过程记录。 1.固件…

mysql5.7源码安装

1.下载MySQL源码包 mysql-5.7.30.tar.gz 2.下载Boost库 tar xf /usr/local/src/boost_1_59_0.tar.bz2 3.解压源码包到指定的目录:安装 mkdir build && cd build cmake .. -DCMAKE_INSTALL_PREFIX/usr/local/mysql \ -DSYSCONFDIR/etc \ -DWITH_MYISAM_STORA…

ElasticSearch架构介绍及原理解析

ElasticSearch架构介绍及原理解析文章目录 一、Elasticsearch是什么?1.简介2.历史与发展3.有关概念1.cluster2.shards3.replicas4.recovery5.river6.gateway7.discovery.zen8.Transport 4.安装 二、ElasticSearch架构介绍及原理解析1.基本架构1.1 进程节点1.2 负载均…

人工智能_大模型010_Centos7.9中CPU安装ChatGLM3-6B大模型_安装使用_010---人工智能工作笔记0145

从一个空的虚拟机开始安装: https://www.modelscope.cn/models/ZhipuAI/chatglm3-6b/files 可以看到这里有很多的数据文件,那么这里 这里点击模型文件就可以下载,这个就是chatglm3-6B的文件,需要点击每个文件,然后点击右边的下载,把文件都下载下来 右侧有下载按钮.点击下载可…

Programming Abstractions in C阅读笔记:p306-p307

《Programming Abstractions in C》学习第75天,p306-p307总结,总计2页。 一、技术总结 1.Quicksort algorithm(快速排序) 由法国计算机科学家C.A.R(Charles Antony Richard) Hoare(东尼.霍尔)在1959年开发(develop), 1961年发表…

【数据结构和算法初阶(C语言)】链表-单链表(手撕详讲单链表增删查改)

目录 1.前言:顺序表回顾: 1.1顺序表的优缺点 2.主角----链表 2.1链表的概念 2.2定义一个单链表的具体实现代码方式 3.单链表对数据的管理----增删查改 3.1单链表的创建 3.2单链表的遍历实现 3.2.1利用遍历实现一个打印我们链表内容的函数的函数…

LeetCode——栈和队列(Java)

栈和队列 简介[简单] 232. 用栈实现队列[简单] 225. 用队列实现栈[简单] 20. 有效的括号[简单] 1047. 删除字符串中的所有相邻重复项[中等] 150. 逆波兰表达式求值[困难] 239. 滑动窗口最大值[中等] 347. 前 K 个高频元素 简介 记录一下自己刷题的历程以及代码。写题过程中参考…

【Linux】进程优先级以及Linux内核进程调度队列的简要介绍

进程优先级 基本概念查看系统进程修改进程的优先级Linux2.6内核进程调度队列的简要介绍和进程优先级有关的概念进程切换 基本概念 为什么会存在进程优先级?   进程优先级用于确定在资源竞争的情况下,哪个进程将被操作系统调度为下一个运行的进程。进程…

Linux设备模型(七) - Netlink

一,什么是netlink通信机制 Netlink套接字是用以实现用户进程与内核进程通信的一种特殊的进程间通信(IPC) ,也是网络应用程序与内核通信的最常用的接口。Netlink 是一种特殊的 socket,它是 Linux 所特有的。 Netlink 是一种在内核与用户应用间进行双向数…

PCB:多CAN口的信号转接板

背景 在测试多路CAN口时,需要频繁更换接口引脚,从而接入CAN收发器。为了提升测试效率,可以设计一个简易多路CAN收发器转接板。PCB板子一端是40脚母口,另一端是10路CAN螺钉式接线端子,自带电池减少接线。 分配空闲时间…