LeetCode链表总结

206.反转链表

两种方法,一种是迭代法(头插法),一种是递归法。头插法比较简单,就不再多说了,讲下递归法。主要是要注意递归以后head->next指向的是哪个结点,其实head->next的指向是不变的,还是正序第二个,但是逆序以后就是倒数第二个结点了,按照递归的思路需要让这倒数第二个结点指向head结点,所以head->next->next = head,然后记得将head->next置为null,不然会出现环。

83.删除排序链表中的重复元素

两种方法,一种是迭代法,一种是递归法。迭代法就是一前一后两个指针,如果两指针指向的数值相同,就删掉其中一个。递归法得看head的数值和head->next的数值是否相同,如果相同那就删掉head->next,如果不同那就直接返回。

​​​​​​25.K个一组翻转链表

两种方法,一种是迭代法,一种是递归法。迭代法代码长一点,递归法更好写一点。迭代法需要先向后走k步,确保存在这k个结点,然后头插法反转这k个结点,把这段接在之前的处理结果上,如果不足k个结点那就不必反转。递归法看一下是否存在k个结点,如果不存在返回head,如果存在那就对head向后k步的位置递归处理,然后head往后这k个结点头插法反转,最后返回头部指针。

​​​​​​160.相交链表

两种方法,第一种方法是先统计出两链表各自长度,设两个指针,让那个长的链表指针先前进到和短的链表相同的位置,也就是如果链表a长度为5,链表b长度为7,那就先让b指针前进两步,然后a指针和b指针同步前进,返回第一个相同的位置。第二种方法是a指针和b指针同时前进,如果a到头了再从b链表上走一遍,b到头了再从a链表上走一遍,这样a和b最后走的距离相同,而它们走的最后一段就是重合部分,所以一定能同时走到交点位置。

​​​​​​21.合并两个有序链表​​​​​

两种方法,一种是迭代法,一种是递归法。迭代很简单,设一个尾指针,谁小把谁接过来就行了。递归法就是看下两链表第一个结点谁小,小的那个结点作为新链表的头,然后其余部分递归,返回值就是头部指针,把这个指针连在小的结点后面就行。

143.重排链表

这题是个融合怪,题目要求把a0 -> a1 -> ... -> an变成a0 -> an -> a1 -> an-1 -> ...这样的,可以看到其实就是两个链表一个结点接一个结点拼起来的新链表,首先求出中间位置,然后从中间位置分割为两链表,后面的链表头插一下做个反转,然后和前一个链表交替拼接就好了。

148.排序链表

不管是冒泡、快排、选择都不适合放到链表上用,但是归并貌似很适合链表排序。所以可以按照归并排序来处理,先找到中间位置,然后拆分为两个链表,分别递归下去,最后再把已经排好序的两个链表合并成一个有序链表。

141.环形链表

快慢指针即可,如果快指针遇到了null那就说明无环,如果快慢指针指向相同位置那就说明有环。

19.删除链表的倒数第 N 个结点

维护两个距离为n的同步指针,当前面那个指针走到头了就可以用后面那个指针删了。

23.合并K个升序链表

归并排序的思路,只不过朴素归并中的数组元素被替换成了链表指针,但是做法是一样的,时间复杂度plogq,p是所有链表元素数量加和,q是链表个数。还可以用优先队列去做,时间复杂度也是plogq,只需要自定义优先队列排序规则,使链表首结点值最小的排在队头,然后每次取出队头元素,该元素是个链表,把链表首结点删除剩余部分再次入队即可。

2.两数相加

这题比较简单,直接模拟就行了。

92.反转链表 II

进阶要求一趟扫描,所以这一趟扫描要做到两件事,首先要找到第一段链表尾部指针和第三段链表首部指针,然后就是将第二段进行反转,反转后将三部分拼接就好了,要注意边界条件。

142.环形链表 II

首先先用快慢指针判断是否有环,在确定有环后还需要知道怎么求环的入口位置,可以在快慢指针相遇时让慢指针再跑一圈求出环的长度,然后设置距离为环长的两个同步指针,从起点开始跑,当二者相遇时就是环的入口位置。

82.删除排序链表中的重复元素 II

对于一个元素,是否要删除它可以看它前后两个元素,如果当前元素和前一个或后一个元素值相同,那就应该删除。然后可以转换为往新链表中添加元素的方式,注意最后一个元素的next要置空。

234. 回文链表

先看数据范围,由于链表中数字都是0~9的,所以可以想到把链表上的值转成字符串,然后判断字符串是否回文,可惜运行时会超内存。于是只能换另一种方法,先求下链表长度,然后把链表前一半反转,之后挨个元素比较前一半和后一半对应位置是否相同。另外找链表中点的时候可以用快慢指针来优雅地解决。

24. 两两交换链表中的节点

这题思路本身不难想,观察一下其实可以转化为两个链表的合并,将偶数位置的元素单独摘出来形成一个新链表,然后和剩下元素构成的链表进行合并就好了,但是实现起来出了个bug卡了我好久,主要还是指针操作的顺序没有思考好,写代码前要先在脑海里过一遍,不要想当然。

445. 两数相加 II

先链表反转再相加,然后再反转回去。如果不想反转的话,那可以选择用栈处理。

61. 旋转链表

先求出链表长度len,然后k %= len,接下来就是开两个距离为k的指针,快指针跑到链表尾部时停止,然后把慢指针->next置空,快指针->next置为head就好了。注意一下空链表和k = 0的情况。

328. 奇偶链表

和之前一道题很像,先把偶数位置结点摘出来形成新链表,然后两个链表前后拼接就行了。

138. 复制带随机指针的链表

这题属于知道方法就能秒,但不知道方法的话要想很久。两种方法,第一种是用哈希表存下来原始结点和新建结点之间的映射关系,然后遍历一遍原始链表mp[p]->next = mp[p->next],mp[p]->random = mp[p->random]就结束了。第二种方法是在原始链表的每个结点后面插入新建结点,然后在每个原始结点位置就可以更新它后面挨着的新建结点random指针,最后再把偶数位置结点摘出来就好了。

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

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

相关文章

第二模块 函数模块

第二模块 函数&模块 day09 文件操作相关1. 文件操作1.1 读文件1.2 写文件1.3 文件打开模式1.4 常见功能1.5 上下文管理练习题 2.csv格式文件3.ini格式文件4.XML格式文件4.1 读取文件和内容4.2 读取节点数据4.3 修改和删除节点4.4 构建文档 5.Excel格式文件5.1 读Excel5.1 写…

微信小程序之页面导航、生命周期和WXS脚本

学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博客但无从下手,急需…

STM32F407移植OpenHarmony笔记2

接上篇,搭建完开发环境后,我们还要继续工作。 官方合作的开发板刚好有STM32F407,我准备试一下开发板的demo,虽然我用的不是他们的开发板。 先下载以下3份代码: https://gitee.com/openharmony/device_board_talkweb…

Python 使用重构重命名一键更改变量名的方法

一个变量有多处引用的情况下,需要重命名,可以使用重构重命名进行一键更改。 方法是:选择变量名–>右键–>Refactor–>Rename(也可以使用快捷:选择变量后按下ShiftF6),然后直接输入新的变量名即可…

基于Matlab/Simulink直驱式风电储能制氢仿真模型

接着还是以直驱式风电为DG中的研究对象,上篇博客考虑的风电并网惯性的问题,这边博客主要讨论功率消纳的问题。 考虑到风速是随机变化的,导致风电输出功率的波动性和间歇性问题突出;随着其应用规模的不断扩大以及风电在电网中渗透率…

[echarts] 图表工具栏 toolbox

option{// 工具栏配置toolbox:{id:1, // 组件IDshow:true, // 是否显示工具栏orient:horizontal, // 工具栏 icon 的布局朝向itemSize:15, // 工具栏 icon 的大小itemGap:10, // 工具栏…

DjangoURL调度器(二)

一、默认值与额外参数 1.1、默认值 1.1.1、urls.py from django.urls import pathfrom . import viewsurlpatterns [# http://127.0.0.1:8000/polls/blog/ 等同于 # http://127.0.0.1:8000/polls/blog/1/path(blog/, views.page),# http://127.0.0.1:8000/polls/blo…

springboot项目开发,使用thymeleaf前端框架的简单案例

springboot项目开发,使用thymeleaf前端框架的简单案例!我们看一下,如何在springboot项目里面简单的构建一个thymeleaf的前端页面。来完成动态数据的渲染效果。 第一步,我们在上一小节,已经提前预下载了对应的组件了。 如图&#x…

vue之pinia存储和读取数据

我们已经搭建好了pinia的环境,现在我们使用pinia来存储和读取数据。Pinia是Vue的状态管理库,允许在Vue组件之间共享状态。 vue的pinia环境搭建 创建一个store文件,包含count.ts和lovetalk.ts,存储数据 import { defineStore }…

签到业务流程

1.技术选型 Redis主写入查询,Mysql辅助查询,传统签到多数都是直接采用mysql为存储DB,在大数据的情况下数据库的压力较大.查询速率也会随着数据量增大而增加.所以在需求定稿以后查阅了很多签到实现方式,发现用redis做签到会有很大的优势.本功能主要用到r…

python222网站实战(SpringBoot+SpringSecurity+MybatisPlus+thymeleaf+layui)-自定义帖子管理实现

锋哥原创的SpringbootLayui python222网站实战: python222网站实战课程视频教程(SpringBootPython爬虫实战) ( 火爆连载更新中... )_哔哩哔哩_bilibilipython222网站实战课程视频教程(SpringBootPython爬虫实战) ( 火…

C++学习笔记(五十):c++ 移动语义与std::move

本节介绍c的移动语义与新特性std::move&#xff0c;本节介绍的内容主要用在性能优化上。 c移动语义和c左值右值的内容相关联&#xff0c;可以先看之前发的左值右值内容。 不使用移动语义的代码如下&#xff1a; #include <iostream> class String { public:String() …

Django学习之小试牛刀

六、Django学习之小试牛刀 其他关于Python Web开发笔记&#xff1a;&#xff08;如果遇到问题可以一起交流~&#xff09; 一、Flask学习之HTML-CSDN博客 二、Flask学习之CSS-CSDN博客 【接上篇】二、Flask学习之CSS&#xff08;下篇&#xff09;-CSDN博客 三、Flask学习之B…

面试题:Spring在多线程环境下如何确保事务一致性

文章目录 问题在现如何解决异步执行多线程环境下如何确保事务一致性事务回顾事务实现方式回顾编程式事务那么编程式事务是什么样子呢&#xff1f; 利用编程式事务解决问题问题分析完了&#xff0c;那么如何解决问题呢&#xff1f;总结 问题在现 我先把问题抛出来&#xff0c;大…

JavaScript 第十八章(条件语句深度解析)

条件语句在编程中扮演着至关重要的角色&#xff0c;它们允许我们根据不同的条件执行不同的代码路径。在JavaScript中&#xff0c;我们主要通过if、else、else if和switch语句来实现这一功能。 if语句 if语句是最基础的条件判断语句&#xff0c;它允许我们在条件为真时执行代码…

QFile文件操作方法

一.概述 QFile 类支持对文件进行读取、写入、删除、重命名、拷贝等操作&#xff0c;它既可以操作文件文件&#xff0c;也可以操作二进制文件。 二.QFile方法 1.使用 QFile 读写文件之前必须先打开文件&#xff0c;调用 open() 成员方法即可&#xff0c;常用的语法格式为&…

强化学习 - Trust Region Policy Optimization (TRPO)

什么是机器学习 Trust Region Policy Optimization&#xff08;TRPO&#xff09;是一种策略梯度方法&#xff0c;用于解决强化学习问题。TRPO旨在通过限制策略更新的大小&#xff0c;提高训练的稳定性。这样可以防止在参数空间中迅速迭代导致过大的更新&#xff0c;从而保持策…

LandrayOA内存调优 / JAVA内存调优 / Tomcat web.xml 超时时间调优实战

目录 一、背景说明 二、LandrayOA / Tomcat 内存调优 2.1 \win64\tomcat\conf\web.xml 文件调优 2.2 \win64\tomcat\bin\catalina64.bat 文件调优 一、背景说明 随着系统的使用时间越来越长&#xff0c;数据量越多&#xff0c;发现系统的有些功能越来越慢&…

基于InceptionV2/InceptionV3/Xception不同参数量级模型开发构建中草药图像识别分析系统,实验量化对比不同模型性能

最近正好项目中在做一些识别相关的内容&#xff0c;我也陆陆续续写了一些实验性质的博文用于对自己使用过的模型进行真实数据的评测对比分析&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 《移动端轻量级模型开发谁更胜一筹&#xff0c;efficientnet、mobilenetv2、…

ubuntu 22 安装 node,npm,vue

1:安装 nodejs sudo apt update curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - sudo apt update && sudo apt install -y nodejs node -v 2:安装npm sudo npm install n -g npm -v 3:安装vite npm install vite -g 4:运行vue 把项目拷贝到…