给定一个单链表,若该链表有环,返回环的起点,若没有,返回NULL
基本思路:
每遇到一个节点,计数器++ ,当遇到访问次数为2时,返回该节点,否则在循环结束前还没有找到,则返回NULL
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead)
{
if(!pHead)
return null;
map<ListNode*,int> flag;//统计节点访问次数
while(pHead)
{
if(++flag[pHead]==2)
return pHead;
pHead=pHead->next;
}
return null;
}
};
进阶思路:双指针思路,
- 设置一快一慢双指针,初始化双指针指向起点
- 每次快指针移动2步,慢指针移动1步
- 若有环,则一定在环中相遇
- 设置快指针到起点,2个指针每次移动1步,相遇时即为环起点
证明: