在相遇时
快指针路程=**a+(b+c)k+b** ,k>=1  其中b+c为环的长度,k为绕环的圈数(k>=1,即最少一圈,不能是0圈,
不然和慢指针走的一样长,矛盾)。
慢指针路程=**a+b **
快指针走的路程是慢指针的两倍,那么有:
**(a+b)*2=a+(b+c)k+b **
整理可得
**a=(k-1)(b+c)+c** 意思为:链表头到环入口的距离=相遇点到环入口的距离+(k-1)圈环长度。
其中k>=1,所以k-1>=0圈。所以两个指针分别从链表头和相遇点出发,最后一定相遇于环入口。
//双指针解法
class Solution {
public:
    ListNode* EntryNodeOfLoop(ListNode* pHead) {
        ListNode* fast=pHead;
        ListNode* slow=pHead;
        while(fast->next!=NULL&&fast!=NULL){//特别容易越界,注意判断
            fast=fast->next->next;//快指针走两步
            slow=slow->next;//慢指针走一步
            if(fast==slow){//第一次相遇时
                break;
            }
        }
        if(fast==NULL||fast->next==NULL)return NULL;//没有环的情况
        //cout<<fast->val<<endl;
        fast=pHead;
        while(fast!=slow){//相遇时为链表入口
            fast=fast->next;
            slow=slow->next;
        }
        return slow;
    }
};