链表中环的入口节点
链表中环的入口节点
https://www.nowcoder.com/practice/6e630519bf86480296d0f1c868d425ad?tpId=117&&tqId=34924&rp=1&ru=/ta/job-code-high&qru=/ta/job-code-high/question-ranking
利用快慢指针方法判断链表是否存在环,并记录两指针相遇位置。
题目描述:对于一个给定的链表,返回环的入口节点,如果没有环,返回null
参照下图,假设图中存在环且快慢指针在C处相遇,设|AB|=a, |BC|=b, |CB|=c,有2(a+b)=a+b+n(b+c),推出a=n(b+c)-b,因此让两个指针分别从A和C以相同速度前进,两个指针再次相遇的位置即为环的入口节点。
代码如下:
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
if(!head) return nullptr;
ListNode *l1 = head;
ListNode *l2 = head;
while(l2 && l2->next){
l1 = l1->next;
l2 = l2->next->next;
if(l1 == l2){
l2 = head;
while(l2 != l1){
l2 = l2->next;
l1 = l1->next;
}
return l1;
}
}
return nullptr;
}
};
