链表算法题精讲:从两数相加到K组翻转

这篇文章来讲链表相关的算法题,由于博主太懒了,题做了之后就一直没写博客,所以更新的时间间隔得比较久,请各位见谅,由于是与链表相关的算法题,所以希望有一点链表的基础再来看这篇文章,效果可以会比较好

1.两数相加

题目来源:2. 两数相加 - 力扣(LeetCode)

这道题因为两个链表本身就是逆序进行存放的,所以相比于按照原顺序存放的链表,会更好写,不然就要考虑把链表逆序之类的

在计算每一位的和时,要考虑到是否会进行进位,所以需要设置一个sign变量来记录是否会进位

而且这道题比较阴的地方是,两个链表的长度还可能是不一样的

有可能一个链表遍历完了,另一个链表还有节点没有遍历到

所以我们在循环条件的控制上需要多加考虑

具体代码如下:

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

题目来源:24. 两两交换链表中的节点 - 力扣(LeetCode)

这道题题目的意思很好理解,要求交换链表中相邻的节点,假如要交换两个节点,我们需要考虑的公有四个节点,因此需要定义四个指针变量来进行操作

又因为头结点并没有前置节点,为了方便保持统一性,我们可以设置哨兵位节点

用图来分析思路会比较清楚:

因为我们定义了多个指针,所以在改变指针指向的过程中,并不需要过多考虑改变的顺序,因为指针的位置并不会丢失

具体代码如下:

3.重排链表

题目来源:143. 重排链表 - 力扣(LeetCode)

这道题可以拆分为三个算法题:逆序+合并两个链表+寻找中间节点,都是我们之前学过的,并且这道题的合并两个链表并不需要考虑节点中的值,只需要按顺序合并就够了

具体代码如下:

4.合并K个升序链表

题目来源:23. 合并 K 个升序链表 - 力扣(LeetCode)

我们在数据结构的学习时,有做到合并两个有序链表那个题,这道题与那个题是类似的

合并两个有序链表是从两个链表的节点中,取较小的那个,插入到新链表中

这道题是从多个链表的节点里取较小的那个

为了达到这个效果,我们可以使用堆来辅助

建一个小堆,来获得链表节点数值最小的那个节点

因为优先级队列建堆默认建的是大堆,所以我们需要额外写一个仿函数,来建小堆

具体代码如下:

其实这道题还有别的解法,可以先合并前两个链表,合并完的新的链表再跟下一个链表合并

在这里就不实现这种解法了

5.k个一组翻转链表

题目来源:25. K 个一组翻转链表 - 力扣(LeetCode)

要解决这道题,我们要先算出一共要翻转多少组

所以我们需要先把count给算出来

然后就一组头插到新链表中

每次的头指针要往后走k次才能够到下一组

头插完之后,需要将不用翻转的元素尾插到链表中

代码如下:

以上就是本篇文章的全部内容了,如果对你有帮助,可以点个赞支持一下,感谢各位的观看

TA 关注的仓库 - 陌染青云 (mo-ran-qingyun) - Gitee.com

这是我个人的gitee 仓库,账号上文章的代码都会发到仓库里,有兴趣可以看一下

相关推荐
HAPPY酷1 小时前
C++ 自定义内存池优化点云处理:从裸指针到 RAII 自动回收
开发语言·c++
梦帮科技1 小时前
量子纠缠网络与量子隐形传态攻防:量子中继器信道串扰、纠缠态保真度降解与量子路由劫持
开发语言·网络·人工智能·算法·自动化·php
老王IT2 小时前
C语言语法基础语法介绍
c语言·开发语言·算法
m0_719640872 小时前
2026年适合课题研究的具身智能实验室建设方案有哪些可参考?
经验分享·算法
LMT流氓兔2 小时前
第五单元——第9课:防止同一次操作重复执行
java·服务器·数据库·算法·ai·langchain
zhangdaliangmvp2 小时前
快速排序的学习理解:从基础分治到三路划分优化
c++·学习·算法
乐迪信息2 小时前
AI算法盒子船体烟火检测:港口火灾早预警
人工智能·深度学习·算法
cu1432 小时前
细谈IT6563的具体功能与其应用
c语言·c++·单片机·嵌入式硬件
lisw053 小时前
发酵算法两大应用方向解析
算法·数学建模