一.题目
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
说明:不允许修改给定的链表。
进阶:你是否可以使用 O(1) 空间解决此题?
来源:力扣(LeetCode)
链接:link
二.思路:快慢指针
2
∗
(
a
+
b
)
=
a
+
n
∗
(
b
+
c
)
+
b
2*(a+b)=a+n*(b+c)+b
2∗(a+b)=a+n∗(b+c)+b
化简
a
=
c
+
(
n
−
1
)
∗
(
b
+
c
)
a=c+(n-1)*(b+c)
a=c+(n−1)∗(b+c)
注意右边的实际意义:
第一次相遇位置走到入口
三.代码
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
if(head==NULL||head->next==NULL)
return NULL;
ListNode *v1(head),*v2(head);
while(v2!=NULL&&v2->next!=NULL)
{
v1=v1->next;
v2=v2->next->next;
if(v1==v2)
break;
}
if(v2==NULL||v2->next==NULL)
return NULL;
v1=head;
while(v2!=v1)
{
v2=v2->next;
v1=v1->next;
}
return v1;
}
};
**调试错误:
v1(head)v2(head)
if(v1!=v2)
while();