一.题目及剖析
https://leetcode.cn/problems/linked-list-cycle-ii/description/
这道题就是找到链表中环的入口
二.思路引入
假设起点到环的入口的距离为L, 环的长度为C, 入口到相遇点的距离为C - N
设定一个快慢指针,速度分别为2, 1
则有 (L + kC - N) = 2*(L + C - N)
即L = (k - 1)C + N
说明,如果我设定两个速度相同的指针,一个从起点开始遍历,一个从相遇点开始遍历,那么它们会在入口处碰撞
三.代码引入
/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode *detectCycle(struct ListNode *head) { if(head == NULL || head->next == NULL) return NULL; struct ListNode* fast, * slow; slow = fast = head; while(fast && fast->next) { slow = slow->next; fast = fast->next->next; if(slow == fast) { struct ListNode* meet = fast; while(meet != head) { meet = meet->next; head = head->next; } return meet; } } return NULL; }
四.思路扩展
这道题如果将这个带还链表从相遇点断开,那么其实就是一个相交链表,交点就是环的入口