🗣️题目讲解
题目来源:力扣(LeetCode)
题目难度:中等
题目链接:返回链表开始入环的第一个节点
在上一篇我们讲解了如何判断链表是否构成环,是通过快慢指针在环中相遇实现的,这一篇我们讲解如何找到入环的第一个节点
结论:
让tmp从链表的第一个节点走,让slow从相遇点向后走,tmp,和slow每次只走一步,因为路程相同,所以会相遇,相遇点则为入环的第一个节点
代码实现
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode Node;
struct ListNode *detectCycle(struct ListNode *head) {
Node*fast=head;
Node*slow=head;
Node*tmp=head;
while(fast&&fast->next)
{
fast=fast->next->next;
slow=slow->next;
if(fast==slow)
{
while(slow!=tmp)
{
slow = slow->next;
tmp = tmp->next;
}
return slow;
}
}
return NULL;
}