leetcode:环形链表的入环点

题目描述

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

leetcode:环形链表的入环点_第1张图片

leetcode:环形链表的入环点_第2张图片

leetcode:环形链表的入环点_第3张图片

leetcode:环形链表的入环点_第4张图片

题目分析

我们假设起点到环的入口点的距离是L,入口点到相遇点的距离是X,环的长度是C

那么画图我们可以得知:

  • 从开始到相遇时slow走的距离是L+X
  • 从开始到相遇时fast走的距离是L+n*C+X

(n:slow进环前,fast已经在环里走了 n 圈)

leetcode:环形链表的入环点_第5张图片

由于fast=slow*2,所以我们可以得到结论:一个指针从相遇点开始走,一个指针从头开始走,最终会在入口点相遇

leetcode:环形链表的入环点_第6张图片

我们可以画图来证明一下:

leetcode:环形链表的入环点_第7张图片

代码示例

根据这个思路我们可以写出代码:

leetcode:环形链表的入环点_第8张图片

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode *detectCycle(struct ListNode *head) {
    struct ListNode *slow,* fast;
    slow=fast=head;
    while(fast&&fast->next)
    {
        slow=slow->next;
        fast=fast->next->next;
        if(slow==fast)//相遇
        {
            struct ListNode *meet=slow;
            while(head!=meet)
            {
                head=head->next;
                meet=meet->next;
            }
            return meet;
        }
    }
    return NULL;
}

结果当然也是通过了

leetcode:环形链表的入环点_第9张图片

你可能感兴趣的:(#,刷题,leetcode,链表,算法)