题目描述
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
解题思路
- 用快慢指针解决问题,如上图,红色是慢指针走的路程,蓝色是快指针走的路程。快指针每次走两步,慢指针每次走一步。
- 当慢指针走到入口节点时,路程为X,因为快指针每次走慢指针的两倍,所以快指针路程为2X。
- 当他们相遇时,慢指针又走了Y,快指针则又走了2Y。
- 根据上图我们可以得知,当慢指针走到入口节点时,快指针与慢指针的短弧距离为 ,长弧距离为 。
- 当快慢指针相遇时,它们与入口节点的长弧距离为 ,也就是说只要让快指针回到起点,慢指针不动,然后它们每次只走 1 步,它们必定会在 X 步后相遇,这个位置正是入口节点。
Java代码实现
public class Solution { public ListNode EntryNodeOfLoop(ListNode pHead) { ListNode fast, slow; if ((fast = slow = pHead) == null) return null; while (fast.next != null && fast.next.next != null) { slow = slow.next; fast = fast.next.next; if (slow == fast) break; } if (fast == null || fast.next == null) return null; fast = pHead; while (fast != slow) { fast = fast.next; slow = slow.next; } return fast; } }