一、问题来源 : LeetCode287. Find the Duplicate Number
二、解决问题 :含环链表中环入口结点的寻找问题
三、算法介绍
1、传统方法:用HashSet来解决
假设ListNode类已定义,则按序存入Set后第一个重复的结点即为环入口
public ListNode EntryNodeOfLoop(ListNode pHead){
HashSet<ListNode> hs = new HashSet<ListNode>();
while(pHead!=null){
if(!hs.add(pHead))//如果包含了,那么这个就是入口结点
return pHead;
pHead = pHead.next;
}
return null;
}
如果采用这种方法,必须完整得完成一次环结点的遍历;
2、Floyd算法(弗洛伊德的乌龟和兔子问题)
【1】算法介绍
这里的思路本质上是快慢指针,hare(兔指针,代表快结点)每次走2步,tortoise(龟指针,代表慢节点)每次走一步,令x是出发点到环的起点的距离,y是环的长度,可以证明,乌龟最多走x+y步,兔子最多2(