给定一个链表的头节点 head
,返回链表开始入环的第一个节点。 如果链表无环,则返回 null
。
如果链表中有某个节点,可以通过连续跟踪 next
指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos
来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos
是 -1
,则在该链表中没有环。注意:pos
不作为参数进行传递,仅仅是为了标识链表的实际情况。
不允许修改 链表。
思路一:快慢指针
c语言解法
struct ListNode *detectCycle(struct ListNode *head)
{
struct ListNode *slow=head,*fast=head;
while(fast!=NULL&&fast->next!=NULL)
{
slow=slow->next;
fast=fast->next->next;
if(fast==slow)
{
struct ListNode* ptr=head;
while(ptr!=slow)
{
ptr=ptr->next;
slow=slow->next;
}
return ptr;
}
}
return NULL;
}
分析:
本题要返回入环的第一个节点,可以利用快慢指针的方法,当快指针与慢指针相遇时两个指针都在环里,再设置一个节点指向头节点,再不断向后直到两个相等后则到了环开始的地方,返回ptr即可
总结:
本题考察判断环形指针的方法,因为快指针的速度为慢指针的两倍,所以两个指针相遇时快指针在环中比慢指针多走相同路程,根据这个特点即可找到环开始的节点