链表算法题精讲:从两数相加到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 仓库,账号上文章的代码都会发到仓库里,有兴趣可以看一下

相关推荐
Pniubi2 小时前
关于算法用现成数据结构和手撕
数据结构
唐墨1233 小时前
linux kernel 比较数据大小的宏定义
linux·算法
拂拉氏4 小时前
【知识讲解-题目讲解】 统计满足K约束的子字符串数量2 (滑动窗口+前缀和+二分查找+分析)
算法·前缀和·二分查找·滑动窗口
通信小呆呆8 小时前
电子战抗干扰技术:当“不被干扰”成为一种系统
算法·通信·mimo·isac
老歌老听老掉牙8 小时前
案例 7:二维 Rosenbrock 函数最小值(香蕉函数)
c++·pso
笑容掩饰我的失落8 小时前
区块链从小白到精通(八):从零实现一个标准 ERC-20 代币(完整可运行代码)
算法·区块链·php·智能合约·哈希算法
Severus_black9 小时前
【C++初阶】Stack、Queue算法题大练兵!
c语言·c++·算法·stl
2601_9679791211 小时前
机器学习必修课:经典算法与Python实战
python·算法·机器学习·实战·课程
程序猿打工仔12 小时前
计算机基础(C语言)考编、专技岗
c语言·开发语言·算法