【题目描述】
LeetCode原题链接
给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。
示例1:
示例2:
示例3:
【假设】:
- 链表头到入口点的距离:L
- 链表头到相遇点的距离:X
- 环的长度:C
分析:
fast一次走两步,slow一次走一步,那么fast走的距离是slow的2倍!
slow走的距离:L + X;
fast走的距离:L + N * C + X;
所以:2 ×(L + X) = L + N * C + X
化简得:L = (N - 1) * C + C - X;
或:L + X = N * C;
意思就是说:一个指针从meet走,一个指针从head走,他们会在入口点相遇。
代码示例:
struct ListNode *detectCycle(struct ListNode *head) {
struct ListNode * slow = head, *fast = slow;
while(fast && fast->next){
slow = slow->next;
fast = fast->next->next;
if(slow == fast){
struct ListNode * meet = slow;
while(meet != head){
meet = meet->next;
head = head->next;
}
return meet;
}
}
return NULL;
}