package main
func EntryNodeOfLoop(pHead *ListNode) *ListNode {
fast, slow := pHead, pHead
for fast != nil && fast.Next != nil {
fast = fast.Next.Next
slow = slow.Next
// 说明有环
if slow == fast {
break
}
}
// 无环
if fast == nil || fast.Next == nil {
return nil
}
// slow 和 fast 相遇
// 假设 slow 走了 k 步,即 起点 到 相遇点 为 k, fast 一定走了 2k 步
// 环入口 与 相遇点 距离设为 m,则有 (相遇点 到 环入口 为 k - m ) == (起点 到 环入口 k - m)
// 此时分别从 起点 和 相遇点 同时出发, slow 和 fast 以相同的速度走 k - m 即可到达入口
slow = pHead
for slow != fast {
slow = slow.Next
fast = fast.Next
}
return slow
}