给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null
。
为了表示给定链表中的环,我们使用整数 pos
来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos
是 -1
,则在该链表中没有环。
说明:不允许修改给定的链表。
解题思路:1.利用前一题环形链表判断是否有环的方法,判断当前链表是否有环
2.若有环,则下一步为找到入环的位置,假设头节点的位置为A,入环的节点的位置为B,当前slow和fast节点相遇的位置为C,因为slow节点的速度是fast节点的1/2,所以假设A->B的距离为X,B->C的距离为Y,C->B的距离为Z(此距离内有环),则2(x+y) = x+y+z+y,即x=z,所以头节点到入环节点的位置,等于当前slow节点到入环节点的位置。
ListNode* Solution::detectCycle(ListNode *head)
{
ListNode *phead = head;
bool IsCycleFlag = 0;
if((head == NULL) || (head->next == NULL))
{
return head;
}
/*1.判断当前链表是否有环*/
ListNode *pslow = phead;
ListNode *pfast = phead;
while((pfast != NULL) && (pfast->next != NULL))
{
pslow = pslow->next;
pfast = pfast->next->next;
if(pslow == pfast)
{
IsCycleFlag = true;
break;
}
}
/*2.找到入环位置,当前pslow,pfast均为链表尾*/
if(IsCycleFlag == true)
{
while(phead != pslow)
{
phead = phead->next;
pslow = pslow->next;
}
return phead;
}
else
{
return NULL;
}
}