一.环形链表1:
解决这个问题时,我想到了上篇博客提到的快慢指针来试试,慢指针走一步,快指针走两步
不管对不对先把代码写出来:
接下来画图解析一下:
起初都在第一个节点的位置,接下来开始走,这时循环一次的位置:
循环两次的位置:
此时可以发现slow也进入环形链表中,此时fast就开始追slow:
再循环两次的时候快慢指针就都停留在了环形链表的起始节点了。
此时提交代码看看是否正确:
成功通过说明我们这个思路是正确的
问题1:那为什么会追到呢:
此时我们假设slow刚好在环形链表的环节点处,而此时fast肯定已经在环里面了,也有可能已经环绕了好几圈,现在假设fast离slow有N的距离
此时fast就开始追slow,然后距离缩减1最后循环一定会减到0成功追到slow.
问题2:如果slow走1步,fast走3步,4步,5步或n步能否追上:
这里假设这个环形链表的长度为C,slow待在环形链表的环节点处,fast离slow有N的距离.
如果fast走3步,slow走1步,所以两者的差距就是以二递减:
此时就要考虑到C-1的大小是多少了,此时就把C-1看做是N如果是偶数就追上了,如果是奇数就还是追不上,就是死循环了。
总结一下:N是偶数第一轮追击就追上了。N是奇数,第一轮就会错过,距离变成C-1,如果C-1是偶数,那么下一轮就追上了,如果C-1是奇数那么就永远追不上了。
fast走4步,5步或者n步的时候就跟3步一样分析,到最后还是要讨论C-一个值的奇偶大小。
问题3:永远追不上的条件:
根据fast走3步,slow走一步的总结:
则当N是奇数,C是偶数时就永远追不上了。但是这种情况一定存在吗:
分析如下:
此时你在看上面分析的情况,N是奇数C是偶数时永远追不上,但2*L永远是偶数,(x+1)*偶数-奇数为奇数,所以两边不相等,所以这种情况根本不存在。所以上面分析的永远追不上的情况是错误的。再根据刚才的等式N是奇数时,C也是奇数。N是偶数时,C也是偶数。所以结论是一定能够追上
二.环形链表2:
根据环形链表一,我们首先的思路还是用快慢指针先找到相遇点。
此时再用相遇点和链表的头节点一起走,当其相遇时就是环形链表的环节点,那为什么呢?
分析如下:
L=X*C-N=(X-1)*C+C-N
假设X=1则C-N=L,所以meet会与head相遇,如果X不为1,其实就是meet在圈里面转圈直至与head相遇。
所以代码如下:
还有一种思考就是,找到相交节点,然后再命名一个新的节点记录meet-->next的位置再将meet->next置为空
此时就是相交链表的问题:160. 相交链表 - 力扣(LeetCode)
相交链表的代码如图
整个代码如图
总结这就是关于两个环形链表的OJ题的详解