判断链表是否有环

 

如上图所示 我们设置快慢两个指针,fast, slow fast一次前进两步,slow一次前进一步,

设a为第一个节点到入环节点的距离。

a=[0->2] 设b为入环口到相遇点的距离。

b=[2->6] 设c为相遇点到入环口的距离。

c=[6->2] 当fast,和slow相遇的时候,fast经过的节点是slow的两倍,

设slow经过的节点数为S 根据上面的设置 可知 S=a+b ,2S=a+b+c+b,

可知 a=c,此时让slow回到第一个节点, fast处于第一次相遇的节点,此时slow从第一个节点出发,因为a=c,所以fast,和slow会在入环口第二次相遇,得到要求的节点。

public class Solution {
    public ListNode detectCycle(ListNode head) {
      ListNode fast =head;
        ListNode slow =head;
        if(head==null||head.next==null){
            return null;
        }
        while(fast!=null&&fast.next!=null){
            fast =fast.next.next;
            slow = slow.next;
            if(fast==slow){
                fast =head;
                while(fast!=slow){
                    fast = fast.next;
                    slow = slow.next;
                }
                return fast;
                
            }
        }
        
        return null;
    }
}

posted @ 2019-07-24 20:22  天涯海角路  阅读(92)  评论(0)    收藏  举报