Leecode之环形链表进阶

简介: Leecode之环形链表进阶

一.题目及剖析

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;
}

四.思路扩展

这道题如果将这个带还链表从相遇点断开,那么其实就是一个相交链表,交点就是环的入口

相关文章
|
20天前
|
Java
环形数组链表(java)
环形数组链表(java)
10 0
|
14天前
|
Java 索引
力扣经典150题第五十六题:环形链表
力扣经典150题第五十六题:环形链表
10 0
|
1月前
|
存储 算法 Java
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
14 2
|
20天前
|
Java
单向环形链表-约瑟夫问题(java)
单向环形链表-约瑟夫问题(java)
8 0
|
20天前
|
存储 算法 C语言
【数据结构与算法 刷题系列】环形链表的约瑟夫问题
【数据结构与算法 刷题系列】环形链表的约瑟夫问题
|
2月前
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点.
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点
30 1
|
2月前
|
存储 算法 索引
【力扣刷题】只出现一次的数字、多数元素、环形链表 II、两数相加
【力扣刷题】只出现一次的数字、多数元素、环形链表 II、两数相加
33 1
|
2月前
|
索引
【力扣刷题】回文链表、环形链表、合并两个有序链表
【力扣刷题】回文链表、环形链表、合并两个有序链表
23 0
|
2月前
|
存储
环形链表题
环形链表题
26 0
|
2月前
|
索引
【力扣】142. 环形链表 II
【力扣】142. 环形链表 II