题目描述
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
思路
- 设立一个vector保存访问过的结点,每次压入新结点之前遍历vector,若找到了相同结点,则返回,若没有,则压入
- 设置快慢指针,都从链表头出发,快指针每次走两步,慢指针一次走一步,假如有环,一定相遇于环中某点(结论1)。接着让两个指针分别从相遇点和链表头出发,两者都改为每次走一步,最终相遇于环入口(结论2)。
代码
方法一:
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead)
{
vector<ListNode*> v;
if(pHead == NULL)
return NULL;
v.push_back(pHead);
pHead = pHead->next;
while(pHead != NULL)
{
for(int i = 0; i < v.size();i++)
{
if(pHead == v[i])
return pHead;
}
v.push_back(pHead);
pHead = pHead->next;
}
return NULL;
}
};
方法二:
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead)
{
ListNode*fast=pHead,*low=pHead;
while(fast&&fast->next){
fast=fast->next->next;
low=low->next;
if(fast==low)
break;
}
if(!fast||!fast->next)return NULL;
low=pHead;//low从链表头出发
while(fast!=low){//fast从相遇点出发
fast=fast->next;
low=low->next;
}
return low;
}
};