题解 | #链表中环的入口结点#双指针法,快慢指针法
链表中环的入口结点
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; } } };