/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param pHead ListNode类 
 * @return ListNode类
 */
 int hascycle(struct ListNode *phead)
 {
    struct ListNode *fastpointer=phead,*slowpointer=phead;
    while(fastpointer!=NULL&&fastpointer->next!=NULL)
    {
        fastpointer=fastpointer->next->next;
        slowpointer=slowpointer->next;
        if(slowpointer==fastpointer)
        return 1;
    }
    return 0;
 }
 struct ListNode* Meet (struct ListNode *phead)
 {
     struct ListNode *fastpointer=phead,*slowpointer=phead;
    do {
        fastpointer=fastpointer->next->next;
        slowpointer=slowpointer->next;
     }while(fastpointer!=slowpointer);
        return fastpointer;
 }
struct ListNode* EntryNodeOfLoop(struct ListNode* pHead ) {
    // write code here
    int p=hascycle(pHead);
    if(p==0)
    {
        return NULL;
    }
struct ListNode *meet=Meet(pHead);
struct ListNode *cur=pHead;
while(cur!=meet)
{
    cur=cur->next;
    meet=meet->next;
    if(cur==meet)
    break;
}
return cur;
}