2021.1.9

1.第一种情形,没有环,那么一定走得到NULL结点

图片说明

2.第二种情形,有环,那么没有NULL结点,且一定走得到表内存在的结点

图片说明
链表一共有n个结点,设置两个指针fast每次走两步,slow每次走一步,假如两者距离为t(t<n),如上图所示t=5,那么第二次走两者距离t-2+1=t-1,第三次距离t-1-2+1=t-2,第四次距离t-3,以此类推知道t=0,两者相遇,说明在有环的情况下fast和slow一定可以相遇。

class Solution {
public:
    bool hasCycle(ListNode *head) {
        ListNode *fast=head;
        ListNode *slow=head;
        while(slow!=NULL && fast->next!=NULL && fast->next->next!=NULL){
            fast=fast->next->next;
            slow=slow->next;
            if(fast==slow)
                return true;
        }
        return false;
    }
};

Slow!=NULL是为了解决情形一,即无环的情况;
Fast->next是为了后面fast->next->next不报错