NC3 链表中环的入口结点


[https://www.nowcoder.com/practice/253d2c59ec3e4bc68da16833f79a38e4?tpId=188&&tqId=38577&rp=1&ru=/activity/oj&qru=/ta/job-code-high-week/question-ranking]

/*返回链表的环的入口结点即可,我们后台程序会打印这个结点对应的结点值;若没有,则返回对应编程语言的空结点即可。
示例1
输入:
{1,2},{3,4,5}

返回值:
3

说明:
返回环形链表入口结点,我们后台程序会打印该环形链表入口结点对应的结点值,即3   
示例2
输入:
{1},{}
返回值:
"null"
说明:
没有环,返回对应编程语言的空结点,后台程序会打印"null"   
示例3
输入:
{},{2}
返回值:
2
说明:
环的部分只有一个结点,所以返回该环形链表入口结点,后台程序打印该结点对应的结点值,即2   
*/
struct ListNode* EntryNodeOfLoop(struct ListNode* a ) {
    // write code here
    if(!a||!a->next)
        return NULL;
    struct ListNode* front=a;//快指针
    struct ListNode* rear=a;//慢指针
    while(front&&front->next){
        front=front->next->next;
        rear=rear->next;
        if(front==rear){
           break;
        }   
    }//结束1是不是环,结束2是有环且快与慢相遇
    if(!front||!front->next)//判断是不是有环
        return NULL;
    struct ListNode* head=a;//题倒是不难,但是你能相信有这个定理,当有环的时候,快慢指针相遇,在到链表头指针和慢指针走一样的长度,最后会在环开始节点相遇woc
    while(head!=rear){
        rear=rear->next;
        head=head->next;
    }
    return rear;
}