问题:
1.给定一个链表,判断链表中是否有环。
2.给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
说明:
不允许修改给定的链表。
时间复杂度:O(n)
空间复杂度:O(1)
解决办法:
使用Floyd判圈算法,也叫龟兔赛跑算法。
原理:
设定每次兔子(快指针)跑两步,乌龟(慢指针)跑一步(这样设定是关键,也是该方法的巧妙之处),两者同时起跑。如果链表中有环,那么兔子会先进入环中,等乌龟进入环后,两者都在环内跑,所以兔子肯定会追上乌龟跟它相遇。
对于问题一,如果兔子能与乌龟相遇,就证明有环,如果兔子能跑到尽头停下来,证明没有环。
public boolean hasCycle(ListNode head) {