【Leetcode——重排链表】

article/2025/4/30 18:28:06

一、重排链表

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

思路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开始,故需要--tailtail--;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://chatgpt.dhexx.cn/article/E9DR1vXd.shtml

相关文章

什么是重绘和重排? 如何去避免?

前言 面试官&#xff1a;既然你刚刚提到了重绘和重排&#xff0c;那就说一说吧。 我&#xff1a;。。。&#x1f4a5; 我们首先来回顾一下渲染流水线的流程: 回流 首先介绍回流。回流也叫重排。 触发条件 简单来说&#xff0c;就是当我们对 DOM 结构的修改引发 DOM 几何尺寸…

jvm指令重排

JVM会在不影响正确性的前提下调整语句&#xff08;指令&#xff09;的顺序。 例如下代码&#xff1a; static int i; static int j; // 在某个线程内执行如下赋值操作 i ...; j ...; //可以看到&#xff0c;至于是先执行 i 还是 先执行 j &#xff0c;对最终的结果不会产生…

CSS重排与重绘总结

昨天面试被问到了什么是重排和重绘&#xff0c;回答的并不是很好&#xff0c;下面来总结一下&#xff1a;关于CSS重排和重绘的概念&#xff0c;在制作中考虑浏览器的性能&#xff0c;减少重排能够节省浏览器对其子元素及父类元素的重新渲染&#xff1b;避免过分的重绘也能节省浏…

Leetcode之重排链表

文章目录 前言一、线性表二、寻找链表中点 链表逆序 合并链表总结 前言 题目如下&#xff1a; 重排链表(点我&#xff09; 一、线性表 因为链表不能下标访问元素&#xff0c;所以我们不能随机访问链表中的元素&#xff0c;因此我们采用数组来存储链表中的每一个元素。利用…

推荐算法架构4:重排

系列文章,请多关注 推荐算法架构1:召回 推荐算法架构2:粗排 推荐算法架构3:精排 推荐算法架构4:重排 1 总体架构 重排主要解决三大问题:用户体验

Cadence Orcad元器件位号重排与原理图页序号重排

一.为什么需要元器件位号重排 在画原理图的过程中&#xff0c;增删改的操作是很多的&#xff0c;这使得元器件位号是通常是混乱的。在绘制完成后&#xff0c;通常需要重排一下位号&#xff0c;这样同一功能块的元器件位号是相邻的&#xff0c;这使得画PCB时能比较方便的确定某一…

你真的了解重排和重绘吗?

做过前端开发的小伙伴就算不是非常理解重排与重绘&#xff0c;但是肯定都听过这两个词。那为什么这两个东西这么重要&#xff1f;因为他与我们的页面性能息息相关&#xff0c;今天&#xff0c;我们就来好好研究一下这两个东西。 浏览器的渲染流程 在讲解重排和重绘之前&#…

简单易懂之什么是重排和重绘?

文章目录 目录 一、浏览器页面是怎么生成的&#xff1f; 二、什么是重排和重绘&#xff1f; 1.什么时候发生重绘&#xff1f; 2.如何优化重排效率&#xff1f; 一、浏览器页面是怎么生成的&#xff1f; 首先让我们来先了解一下浏览器页面生成的过程 文字解析&#xff1a; 1&am…

重排(回流)和重绘

什么是重排和重绘 浏览器下载完页面所有的资源后&#xff0c;就要开始构建DOM树&#xff0c;与此同时还会构建渲染树(Render Tree)。&#xff08;其实在构建渲染树之前&#xff0c;和DOM树同期会构建Style Tree。DOM树与Style Tree合并为渲染树&#xff09; 浏览器下载完成所有…

什么是重排和重绘

简答 1.重排&#xff08;重新排列&#xff09;> 指元素的位置发生改变的时候浏览器会进行重排 2.重绘&#xff08;重新绘制&#xff09;>指元素的基本样式发生改变是发生重绘&#xff0c;比如颜色等。。。 细答 前提概要&#xff08;浏览器使用两个引擎进行工作一是渲…

Docker之发布自己的镜像

首先应当是先登入 其次是将镜像重新打包 在此处使用命令 docker commit fb6af4e48c14 zlx/centos7_vim:1.0 将一个容器生成一个新的镜像 然后把这个镜像改成dockerhub的仓库名&#xff0c;push一下就行了&#xff0c;dockerhub毕竟是国外的网站&#xff0c;换成阿里云就好了

Matlab调用excel数据绘制折线图

如题&#xff0c;matlab之前没接触过&#xff0c;但是电脑上一直有安装&#xff0c;有些老师需要做几张图放论文里&#xff0c;所以尝试了一下&#xff08;excel其实效果也行&#xff0c;但matlab感觉更专业&#xff09; x2:2:778;%x轴上的数据&#xff0c;第一个值代表数据开…

COGS 2075. [ZLXOI2015][异次元圣战III]ZLX的陨落

★★☆ 输入文件&#xff1a;ThefallingofZLX.in 输出文件&#xff1a;ThefallingofZLX.out 简单对比时间限制&#xff1a;1 s 内存限制&#xff1a;256 MB 【题目描述】 正当革命如火如荼&#xff0c;情侣教会日薄西山之时&#xff0c;SOX和FFF的分歧却越来越大&#…

Codechef GRAPHCNT 支配树学习及tarjan算法求解

[Codechef GRAPHCNT]新年的有向图 【题目描述】 zlx同学在学习数论时,被虐了一脸,丧心病狂的他决定去报复社会。 zlx在公园里埋下N颗地雷,用来炸飞在春节期间秀恩爱的情侣。这N颗地雷由M条有向边连接成为一个有向图,zlx则在1号地雷处引爆1号地雷可以到达的地雷。现在,为了…

大数据体系建设经验分享

分享嘉宾&#xff1a;吴荣彬 分贝通 大数据部负责人 编辑整理&#xff1a;zlx 出品平台&#xff1a;DataFunTalk 导读&#xff1a;本文将介绍分贝通在大数据领域的一些建设经验。分贝通在ToB领域是一个年轻的公司&#xff0c;成立六年多&#xff0c;大数据体系刚刚建立一年多&a…

将二维数组转为稀疏数组进行压缩,提高效率

** 稀疏数组 ** ##基本介绍&#xff1a; 当一个数组中大部分元素为&#xff10;&#xff0c;或者为同一个值的数组时&#xff0c;可以使用稀疏数组来保存该数组。 稀疏数组的处理方法是: 1) 记录数组一共有几行几列&#xff0c;有多少个不同的值 2) 把具有不同值的元素的行列…

A数字三角 怨种

问题描述 有一天&#xff0c;无聊的 zlx 从 1 开始数数&#xff0c;同时在纸上写下每个数的个位数字。因为她非常热爱直角三角形&#xff0c;所以在纸上写下的数字按照直角三角形排列。现在告 诉你写她了 N 行数字&#xff0c;要求你打出这些数字。 输入格式 一行一个数 N&a…

聊聊Spring的IOC,AOP、DI、MVC

1 聊聊Ioc,Di,Mvc,Aop 不想看下面内容的&#xff0c;直接上代码连接&#xff0c;以下代码都有注释 传送门 1.1 看启动项 我们先来看看启动项 package com.tian;import com.tian.springframework.annotation.SpringBootApplication; import com.tian.springframework.config…

ZYNQ DDS产生载波FFT变换

环境&#xff1a;vivado2017.4&#xff0c;快速傅里叶变换V9.0 IP核 一&#xff0c;介绍&#xff1a;Xilinx FFT IP核是一种计算DFT的有效方式。 特点&#xff1a;前向变换&#xff08;FFT&#xff09;和反向变换&#xff08;IFFT&#xff09;在复数空间&#xff0c;并且可…

并发队列中迭代器弱一致性原理探究

一、前言 并发队列里面的Iterators是弱一致性的&#xff0c;next返回的是队列某一个时间点或者创建迭代器时候的状态的反映。当创建迭代器后&#xff0c;其他线程删除了该元素时候并不会抛出java.util.ConcurrentModificationException异常&#xff0c;能够保持创建迭代器后的元…