题目
解题思路
很有意思的一道题目。首先肯定可以想到的是储存遍历过的节点,做法类似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 !!!