题解 | #链表中环的入口结点#
链表中环的入口结点
https://www.nowcoder.com/practice/253d2c59ec3e4bc68da16833f79a38e4
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
//从距离相等->联想到单步走遍历
//如果在某点相等,如果单步遍历,则必定是不断重叠走到相等点
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead) {
if(pHead==nullptr||pHead->next==nullptr){
return nullptr;
}
ListNode * slow=pHead->next;
ListNode * fast=pHead->next->next;
while(fast!=nullptr&&fast!=slow){
if(fast->next!=nullptr){
fast=fast->next->next;
slow=slow->next;
}
else{
fast=nullptr;
}
}
if(fast==nullptr){
return nullptr;
}
for(slow=pHead;slow!=fast;){
slow=slow->next;
fast=fast->next;
}
return fast;
}
};
1.得出了nt=x之后,意味着重新分头遍历,可以在重叠部分反复重叠
2.实现时,先处理
2.1 开头
2.2 遍历时边界条件,包括fast->next,fast->next->next
2.3 while的条件
