场景描述
原题描述链接
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 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
解释:链表中没有环。
进阶:
你是否可以不用额外空间解决此题?
C语言实现
思路
首先判断出链表中是否有环,具体思路参见此文。如何判断一个链表中是否有环
当没有环时,返回null。当存在环时,通过上一篇文章我们可以确定快慢指针相遇在哪个结点,假设相遇于N结点处。现在欲求链的环的入口,假设入口在M结点处。
分析:
慢指针经过长度m+n 到达N点,其中m是从链表第一个结点到M结点的长度,n为M结点到N结点的长度。快指针经过的长度是慢指针的两倍即2(m+n)。可知此时快指针再经过(m+n )的长度还可以到达N点,而经过m 长度到达M点。
因此再设立一指针entry从链表第一个结点开始后移,当entry与快指针相遇时,相遇处的那个结点便是环的入口。
代码实现
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode *detectCycle(struct ListNode *head) {