思路:
推导过程:
fast = x + (y + z)*n +y // 快指针走的路程
slow = x + y // 慢指针走的路程
∵ fast = 2 * slow
∴ x = n*(y+z)-y
∴ x = (n-1)*(y+z)+z
当n = 1时:x = z
当n > 1时:x = z + n*(y+z) // 相当于 z 加上 n 倍的周期
故fast = pHead;
slow = 相遇点;
同时向后一个个移动,最终会在环入口相遇
struct ListNode* EntryNodeOfLoop(struct ListNode* pHead )
{
if(pHead == NULL) return pHead; // 极端情况:链表为空
struct ListNode *fast = pHead, *slow = pHead; // 定义快慢指针
while(fast && fast->next) // 判断链表是否有环
{
fast = fast->next->next;
slow = slow->next;
if(fast == slow) // 若有环,则fast和slow肯定会相等
break;
}
if(!fast || !fast->next) // 若fast 或 fast->next 为空,则说明该链表无环
{
return NULL;
}
fast = pHead; // 重难点!!fast指向头,slow目前指向相遇节点
while(fast != slow)
{
fast = fast->next;
slow = slow->next;
}
return fast; // 相遇的节点就是环入口节点
}
上述代码,即为本人所思考出的本题答案