题目:
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。说明:不允许修改给定的链表。
示例 1:
输入:head = [3,2,0,-4], pos = 1
输出:tail connects to node index 1
解释:链表中有一个环,其尾部连接到第二个节点。
示例 2:
输入:head = [1,2], pos = 0
输出:tail connects to node index 0
解释:链表中有一个环,其尾部连接到第一个节点。
示例 3:
输入:head = [1], pos = -1
输出:no cycle
解释:链表中没有环。
分析:先判断有没有环,没有环直接返回空;有环的话先求出环的入口,然后用两个指针,分别从环、链表起始开始一步一步走,走到相遇为止此时位置就是环的入口处。
ListNode *detectCycle(ListNode *head) {
if(head==nullptr)
return nullptr;
ListNode* slow=head;
ListNode* fast=head;
ListNode* miss=nullptr;
ListNode* l1=head;
//看有没有环
while(fast && fast->next)
{
slow=slow->next;
fast=fast->next->next;
if(slow==fast)
{
miss=fast;
break;
}
}
if(miss==nullptr)//miss为空说明没有环
{
return nullptr;
}
else//说明有环
{
while(l1!=miss)
{
l1=l1->next;
miss=miss->next;
}
return miss;//环入口
}
}