【Leetcode——重排链表】

news2024/9/22 21:15:21

一、重排链表

在这里插入图片描述
对于这道题,有两种思路:

思路1.

1.使用一个线性表,存储链表中的每个节点,然后按照题目的条件,来链接线性表的各个节点即可。

在这里插入图片描述
使用左下标和右下标来定位线性表中的节点。

1.先存储链表中的节点数据到线性表

void reorderList(struct ListNode* head)
{
    struct ListNode* tmp[100000];
    int tail = 0;
    struct ListNode*cur = head;
    1.把链表中的节点存储到线性表中
    while(cur)
    {
        tmp[tail++] = cur;
        cur = cur->next;
    }
    int front = 0;
    
    //由于下标从0开始,故需要--tail
    tail--;
    
    while(front<tail)
    {
        tmp[front++]->next = tmp[tail];
        tmp[tail--]->next = tmp[front];
    }
    //到这一步必须置空,否则出现自己的next指向自己,出现环状
    //并且需要是front的next置空,因为在循环中tail和front已经错过了。
    tmp[front]->next = NULL;

    return head;
}

2.循环条件是front < tail

时间复杂度为O(N),空间复杂度为O(N)

思路2.

(1)找到链表的中间节点
(2)将链表中间节点开始之后的链表逆置
(3)将两个链表重新合并

(1)找链表的中间节点可以使用快慢指针来求出。
快指针一次走两步,慢指针一次走一步。
在这里插入图片描述

(2)链表逆置,有两种方法,一种方法是使用三指针,一种方法是使用头插。

三指针法:

在这里插入图片描述

(3)合并两个链表,合并链表,从两个链表的头节点开始链接。
在这里插入图片描述

struct ListNode *middleNode(struct ListNode*head)
{
    struct ListNode*fast = head,*slow = head;
    while(fast && fast->next)
    {
        fast = fast->next->next;
        slow = slow->next;
    }
    return slow;
}

struct ListNode* reverseList(struct ListNode*head)
{
    struct ListNode*prev = NULL;
    struct ListNode*cur = head;
    while(cur)
    {
        struct ListNode*next = cur->next;
        cur->next = prev;
        prev = cur;
        cur = next;
    }
    return prev;
}

void mergeList(struct ListNode*head,struct ListNode*head2)
{
    struct ListNode*l2 = head2,*l1 = head;
    while(l1 && l2)
    {
        struct ListNode*l1next = l1->next;
        struct ListNode*l2next = l2->next;

        l1->next = l2;
        l1 = l1next;

        l2->next = l1;
        l2 = l2next;
    }
}
void reorderList(struct ListNode* head)
{
    if (head == NULL || head->next == NULL)
    {
        return;
    }

    //1.找中间节点
    struct ListNode *midnode = middleNode(head);
    //2.逆置中间节点之后的链表

    //3.按照题目合并链表
    struct ListNode*head2 = midnode->next;
    midnode->next = NULL;
    //把它置空,其实是把midnode纳入第一条链表中的最后一个节点了
    //对后半链表逆置
    head2 = reverseList(head2);

    mergeList(head,head2);   


}

时间复杂度O(n),空间复杂度O(1)

总结

两种方法各有好处,法1空间复杂度大,但是易于理解。
法2相对更难理解,但是空间复杂度小。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

硬件学习 软件 Cadence day09 芯片PCB 封装导出DXF 文件

1.打开自己要导出 DXF 文件的 PCB 封装 (Allegro 软件) 2.导出DXF 文件的按钮 1.点击按钮&#xff0c;打开窗口 2.填写数据 3. 按下 Edit... 按钮 4. 编辑数据 5. 导出数据 &#xff0c;生成DXF 文件 下面的选项自己选择 &#xff1a; Color mapping &#xff1a; …

希腊字母及读音

希腊字母24个希腊字母分别是&#xff1a;Αα、Ββ、Γγ、Δδ、Εε、Ϝϝ、Ζζ、Ηη、Θθ、Ιι、Κκ、Λλ、Μμ、Νν、Ξξ、Οο、Ππ、Ρρ、Σσ、Ττ、Υυ、Φφ、Χχ、Ψψ、Ωω。拼写Α α&#xff1a;阿尔法 AlphaΒ β&#xff1a;贝塔 BetaΓ γ&…

算法套路二:相向双指针

算法套路二:相向双指针 算法套路示例讲解&#xff1a;LeetCode167. 两数之和 II - 输入有序数组 给你一个下标从 1 开始的整数数组 numbers &#xff0c;该数组已按 非递减顺序排列 &#xff0c;请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是…

如何在MacOS上卸载IPGuard的软件--LAgent/LSDhelper程序

IPGuard类的软件一般企业用于办公设备监控&#xff0c;获取员工在设备上操作的信息&#xff0c;同时对文件等信息加密&#xff0c;用于防止企业信息外泄到网络上。但是设备上安装了此类软件一般不容易卸载掉&#xff0c;针对在macos上卸载过程作下讲解。 1. 一般服务类的程序都…

shell文件通配符:任意一个:?、任意数量:*、任意包含[]、[^]:任意不包含

文章目录一. 有哪些文件通配符二. 匹配任意?&#xff1a;匹配任意一个字符*&#xff1a;匹配任意数量的字符串三. 匹配任意指定一个字符1. []&#xff1a;匹配任意包含匹配任意包含字符范围2. [!]与[^]&#xff1a;匹配任意不包含四. 注意事项1. 通配符组合2. 不能跨越目录层级…

运筹系列67:大规模TSP问题的EAX遗传算法

1. 算法介绍 EAX是edge assembly crossover 算子的缩写。本算法有Y nagata教授公布&#xff0c;目前在VLSI最大的几个案例上获得了best的成绩。另外目前MonoLisa 100K问题的最优解也是由其公布&#xff0c;若能得到更优解&#xff0c;可以获得1000美元奖励。 算法步骤如下&…

【教学典型案例】用户称为设计者的正例

目录一&#xff1a;背景介绍二&#xff1a;设计理念三&#xff1a;设计过程按照设计理念设计的功能&#xff1a;1、用户可以根据自己的情况来选择显示哪些活动参与数据。2、用户可以对请假功能和点读功能进行开启和关闭操作&#xff08;默认为全部开启&#xff09;四&#xff1…

我一个女孩子居然做了十年硬件……

2011年&#xff0c;一个三本大学的电子信息专业的大三女学生跟2个通信专业的大二男生组成了一组代表学校参加2011年“瑞萨杯”全国大学生电子设计大赛&#xff0c;很意外的获得了湖北赛区省三等奖&#xff0c;虽然很意外&#xff0c;但还是挺高兴的&#xff0c;毕竟第一次为喜欢…

数据大爆炸时代,大容量硬盘为何不可或缺?

2月27日&#xff0c;中共中央、国务院正式印发《数字中国建设整体布局规划》&#xff08;以下简称《规划》&#xff09;&#xff0c;明确提出要夯实数字中国建设基础&#xff1a;一是打通数字基础设施大动脉&#xff0c;优化各种级别数据中心的合理梯次布局&#xff1b;二是畅通…

Arduino双色LED实验记录

接线图片&#xff1a;双色LED实物和布线有区别&#xff1a;代码&#xff1a;int RED_LED 11; //设置红色为11 int GREEN_LED 10; //设置绿色为10 int val 0;//全局变量val void setup() {// put your setup code here, to run once:pinMode(RED_LED,OUTPUT);//引脚配置pinMo…

HCIP总结(一)

抽象语言---编码---二进制---电信号----处理电信号 &#xff08;电脑工作流程&#xff09; OSI参考模型 ----OSI/RM (核心思想&#xff1a;分层) 应用层----提供各种应用服务&#xff0c;将抽象语言转换成编码&#xff0c;提供人机交互的接口 表示层----将编码转换成二进制 …

10个值得收藏的ChatGPT辅助编程技巧

在我们开始之前&#xff0c;你必须先了解编程语言&#xff0c;然后才能相信 ChatGPT 抛给你的任何东西。 我必须明确这一点&#xff0c;因为许多误入歧途的绵羊被告知 ChatGPT 是新的圣杯&#xff0c;开发人员将被淘汰。 推荐&#xff1a;用 NSDT场景设计器 快速搭建3D场景。 使…

Redis学习(三):五大数据类型及常用操作

五大数据类型 Redis-Key set [key] [value] # 向数据库添加一个键值对 keys * # 查看当前数据库所有的键值 EXISTS [key] # 查看key是否存在在当前数据库中&#xff0c;存在返回1&#xff0c;不存在返回0 move [key] [index] # 将key移动到编号为index的数据库&#xff0c;…

Docker(八)---Docker安全相关设定

文章目录一、理解docker安全二、容器资源控制1.cpu资源限制2.cpu优先级3.内存资源限制4.磁盘io限制三、docker安全加固&#xff08;隔离&#xff09;四、容器特权一、理解docker安全 Docker容器的安全性&#xff0c;很大程度上依赖于Linux系统自身&#xff0c;评估Docker的安全…

扬帆优配|多只“迷你基”清盘未果业绩反领跑 盲目追捧有风险

2023年以来&#xff0c;在信创板块一枝独秀的行情下&#xff0c;多只重仓该板块的基金成绩乘着春风起舞&#xff0c;但作为较为小众的职业&#xff0c;现在来看能够真正享受到红利的基金多为迷你基金。有剖析指出&#xff0c;不少“迷你基”经过押注单一赛道或许投资小盘股等方…

【数据库】排名问题

返回第N高的一个解决思路返回N组中的第N高解决思路分数排名解决思路窗口函数数据库经常被用来解决排名问题。 返回第N高的一个 单表查询: 表: Employee------------------- | Column Name | Type | ------------------- | id | int | | salary | int | ----…

HTML DOM 改变 HTML 内容

HTML DOM 允许 JavaScript 改变 HTML 元素的内容。改变 HTML 输出流在 JavaScript 中&#xff0c;document.write() 可用于直接向 HTML 输出流写内容。实例<!DOCTYPE html><html><body><script>document.write(Date());</script></body>&l…

算法分析与设计之并查集详解

算法分析与设计之并查集1.前言2.并查集的基础2.1.关于动态连通性2.2.动态连通性的应用场景&#xff1a;2.3.对问题建模&#xff1a;2.4.建模思路&#xff1a;2.5.API2.7.Quick-Find算法&#xff1a;2.8.Quick-Union算法&#xff1a;3. 并查集的应用1.前言 本文主要介绍解决动态…

day02_设计测试用例的常见方法

软件测试用例 概念&#xff1a;一个为了特定的目的&#xff08;检验开发的代码实现是否满足用户的需求&#xff09;而设计的文档&#xff08;包含测试输入、执行条件、预期结果&#xff09;&#xff0c;文档的形式可以是xmind、excel等。 测试用例的核心要素 常见测试用例的…

Echarts-授人以鱼不如授人以渔

Echarts 授人以渔 授人以鱼不如授人以渔 这篇文章就告诉大家如何快速查阅官网的配置项手册 建议收藏&#xff0c;老司机请跳过 echarts是一个非常强大的图形库 但是对于很多刚入门的小伙伴而言echarts里面配置项海量的名词看到吐血 想要修改样式的时候不知道改哪里 下面就简…