分析 (1)一种比较偷懒的方法就是遍历链表,并直接利用HashMap来保存已经遍历过的结点。一旦发现已经保存过的结点,那么该结点就是环的入口结点。 (2)参考自https://www.nowcoder.com/questionTerminal/253d2c59ec3e4bc68da16833f79a38e4 我简单画了一个图(上传之后一直是横过来的。。。不知道为什么转不正) 设置两个指针p1和p2,一个快指针,每次走两步,一个慢指针,每次走一步。因为链表有环,所以它们一定会相遇。此时假设慢指针走了 x 步,那么快指针就是走了 2 * x 步,而且此时快指针肯定是绕着环多走了n圈。假设环的长度为r。那么有 2 * x - x = n * r 。再假设链表头到环的入口结点距离为y,那么从环的入口结点走到相遇点,则是走了x-y的距离。然后使两个指针一个从链表头结点开始走,一个从相遇点开始走,每次都走一步。无疑从链表头结点再走y就走到了环的入口结点;相遇点走y步,x-y+y = x,x是r的整数倍,那么也是走到了环的入口结点。