代码随想录day04 两两交换链表中的节点 删除链表的倒数第N个节点 链表相交 环形链表

发布时间 2023-12-30 17:03:30作者: 又见鸣蜩

两两交换链表中的节点题目:

这题画一下链表会比较清晰 写写画画指针位置很快就可以写出来
一开始以为一个tmp就够用了 写着写着发现需要多一个

代码:

删除链表的倒数第N个节点:

没什么思路 只好先看看视频思路

视频思路很简单也很清晰 只需要两个指针 一快一慢 两指针的间隔就是n
这样当快指针到末尾的时候 慢指针此时指向的就是需要删除的位置
但是链表删除当前节点需要上一个节点的next指向next的next的next来删除
所以我们需要快指针多走一步 这样慢指针在快指针到达末尾的时候正好在删除节点的上一个位置
所以需要n += 1
代码如下

链表相交:

看到这个题目第一反应是暴力遍历 直接两条遍历一遍 数值和下标都用字典记录 然后匹配之后再回去找下标
但是 会出现数值相同但是不是同一个节点的情况 也就是不能直接暴力遍历记录

代码如下 写的有些冗余 其实可以写的更简单一些的 直接根据差值调整lenA和lenB就可以不用写三部分差不多的代码了

大概的思路是 先找到两条链的长度做差 根据差值 把长链走差值步 然后一起往下走 边走边判断是不是同一个节点

环形链表 一开始完全没有头绪可言

首先是判断有无环
如果是无环的话 我们让指针一快一慢从head一起出发 那么它们是不可能相遇的
所以如果它们相遇那么一定有环

然后就是求环的入口 我们设定x是head到环入口的距离 y是环入口沿顺时针到快慢指针相遇的位置的距离
z是环入口沿逆时针到快慢指针相遇的位置的距离

视频这个图很清晰的说明了 xyz之间数学推导关系

结论就是x=z+(n-1)loop loop就是里面快指针转圈的圈数
那事情就简单了 既然是一段弧加上n个整圈 那么让一个指针从head的位置和快指针当前位置一起出发
他们相遇的位置就是环的入口

代码如下