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 }