链表趣题---快慢指针判断链表是否有环

时间:2022-07-20 05:22:19

前述

五一假刷博客,看到师兄的快慢指针判断单向链表是否有环及找环入口 感觉真的非常神奇和有趣,今天在谈论Linux下的各种链表操作—list.h 想起了这个有趣的问题,给大家分享一波,结果在找入口时居然忘记了,还是要总结一波,不然真的容易忘。

1.判断单向链表是否有环

具体要求,空间复杂度O(1),时间复杂度O(N)

思路

快慢指针,从链表头开始,快指针每次走两个节点,慢指针每次一个节点,如果他们能相等(指向同一节点),那么就存在环。

解答

单链表存在环,必然像一个“6”,那么无论如何,快慢指针都会进入环里,就像学校的操场一样,跑得快的人最终会和跑得慢的人相遇,(整整快N圈)。

2.要求同上,如何指出环的入口。

当然,我们肯定是先通过上面的方法判断是否存在环,然后进一步找到环的入口节点,修改为一条直的单链表。

思路

还是快慢指针,通过第一题我们让快慢指针相遇了,那下一步就是让快指针回到起点,然后将快指针变成慢指针,一次走一步。然后两个指针继续走,再次相遇时,就指向了入口节点。

解答

假设第一次相遇时慢指针走了N步,那么快指针走2N步。这时让快指针回到起点,必然还会相遇,因为他俩每次走一步,那么既然终点相同,所以他们在相遇点前就一定已经相遇,而第一个相遇点就是单链表和环的交点,也就是入口。

感谢小伙伴帮助推导公式,他还有很多关于链表的有意思的问题,期待。