题解 | #链表中环的入口结点#双指针法,快慢指针法
链表中环的入口结点
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) {
ListNode* p = pHead; // 慢指针,一次走一步
ListNode* q = pHead; //快指针,一次走两步
while(p && q){
p = p->next;
if(q->next && q->next->next){
q = q->next->next;
}else{
q = NULL; //追不上,q先到null,没有环
break;
}
if(p == q){ //相遇 有环
break;
}
}
if(p == q && p){ // 有环,且相遇
int len = 1;
p = p->next;
while(p != q){ //求环的长度
p = p->next;
len++;
}
p = pHead;
q = pHead;
while(len--){ //q先走len步
q = q->next;
}
while(p != q){
p = p->next;
q = q->next;
}
return p;
}else{
return NULL;
}
}
};
查看10道真题和解析
