LeetCode相交链表(Python)——双指针

本文介绍了一种使用双指针解决链表相交问题的巧妙方法,通过让两个指针分别从两个链表头部开始,当一个链表遍历结束转向遍历另一个链表,最终在相交点相遇,实现O(1)空间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

解题思路

很有意思的一道题目。首先肯定可以想到的是储存遍历过的节点,做法类似141题环形链表,但是要求仅用O(1)内存去做,虽然知道要用双指针,但没想到怎么遍历。

看了官方题解确实奇思妙想。p_a指针先遍历列表A,A遍历完了就去遍历B;p_b指针先遍历B,B遍历完了去遍历A。在p_a遍历B和p_b遍历A的时候,如果有相交节点两个指针就能在这里碰到了。这里稍微解释一下:

因为a、b两个列表可以分为两段:
a分为 a不与b相交那一段 + a、b相交的一段
b分为 b不与a相交那一段 + a、b相交的一段

当两个指针走到相交节点时:
p_a走过了 a不与b相交那一段 + a、b相交的一段 + b不与a相交那一段
p_b走过了 b不与a相交那一段 + a、b相交的一段 + a不与b相交那一段

可以看到两个指针所走的路程是一样的,所以可以同时抵达。

我的具体实现如下:
在这里插入图片描述
for循环进行两次,第一次循环的时候较短的链表先被遍历完,第二次循环是为了让长的链表也被遍历完;如果两个链表同样长,也只不过是多遍历了一遍链表而已。跳出for循环时,两个指针就已经在遍历另一个链表了。

执行结果为:

在这里插入图片描述
然后看了评论区大佬们的实现,顿感自己是垃圾:
在这里插入图片描述

(作者:jyd
链接:https://leetcode-cn.com/problems/intersection-of-two-linked-lists/solution/intersection-of-two-linked-lists-shuang-zhi-zhen-l/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 )

至于为什么这样不会无限循环:
在这里插入图片描述
真的nb !!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值