LeetCode 142. Linked List Cycle II(环形链表II) -- c语言
142. Linked List Cycle II
Given a linked list, return the node where the cycle begins. If there is no cycle, return null.
To represent a cycle in the given linked list, we use an integer pos which represents the position (0-indexed) in the linked list where tail connects to. If pos is -1, then there is no cycle in the linked list.
Note: Do not modify the linked list.
Example 1:
Input: head = [3,2,0,-4], pos = 1
Output: tail connects to node index 1
Explanation: There is a cycle in the linked list, where tail connects to the second node.
Example 2:
Input: head = [1,2], pos = 0
Output: tail connects to node index 0
Explanation: There is a cycle in the linked list, where tail connects to the first node.
Example 3:
Input: head = [1], pos = -1
Output: no cycle
Explanation: There is no cycle in the linked list.
Follow up:
Can you solve it without using extra space?
解题思路:
利用双指针(快慢指针)faster以步长为1、lower以步长为2遍历链表,若有环两者总会相遇。
如果有环则找第一个入环结点:
从快慢指针相遇的位置和第一个结点位置开始遍历链表两者相遇的位置为开始入环的第一个结点
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode *detectCycle(struct ListNode *head) {
struct ListNode *faster = head,*lower = head,*p = head;
//利用双指针(快慢指针)确认有环无环
while(faster != NULL&& faster->next != NULL){
lower = lower->next;
faster = faster->next->next;
if(lower == faster){
//有环的情况下寻找第一个入环结点
while(p != lower){
p = p->next;
lower = lower->next;
}
return p; //返回第一个入环结点
}
}
return NULL;
}
后记:
- 理解好循环条件:
while(faster != NULL && faster->next != NULL)此处无需设置lower != NULL条件,faster != NULL就能保证。 - 理解好一个思想:
从快慢指针相遇的位置和第一个结点位置开始遍历链表两者相遇的位置为开始入环的第一个结点。
证明图片引用自博客文章:https://blog.****.net/weixin_40673608/article/details/86762231