Leecode刷题
- 题目描述
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
说明:不允许修改给定的链表。
- 示例
输入:head = [3,2,0,-4], pos = 1
输出:tail connects to node index 1
解释:链表中有一个环,其尾部连接到第二个节点。
- 思路
如图所示,使用快指针和慢指针,且都从头节点开始。规定快指针每次走两步,慢指针每次走一步,则S(快指针)=2 * S(慢指针),S表示路程。
假设最终在D相遇,因此可得到如下关系式:
AB+BCDEB+BD=2 * (AB+BD)------(1)
==>AB+BD=BCDEB-----(2)
根据一圈的关系:BD+DB=BCDEB-----(3)
由(2),(3)可得,AB=DB-----(4)
所以,在编程实现时,可记录快慢指针相遇的结点,然后再从头节点开始,当这两个结点相遇即为循环开始的结点。
- 代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *detectCycle(ListNode *head)
{
ListNode* fast=head;
ListNode* slow=head;
bool cycle=false;
while(fast&&fast->next)
{
fast=fast->next->next;
slow=slow->next;
if(fast==slow)
{
cycle=true;
break;
}
}
if(cycle)
{
ListNode* s=head;
while(s!=slow)
{
s=s->next;
slow=slow->next;
}
return s;
}
return NULL;
}
};