环形链表2

Leecode刷题

  • 题目描述

给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
说明:不允许修改给定的链表。

  • 示例

输入:head = [3,2,0,-4], pos = 1
输出:tail connects to node index 1
解释:链表中有一个环,其尾部连接到第二个节点。
在这里插入图片描述

  • 思路
    在这里插入图片描述

如图所示,使用快指针和慢指针,且都从头节点开始。规定快指针每次走两步,慢指针每次走一步,则S(快指针)=2 * S(慢指针),S表示路程。
假设最终在D相遇,因此可得到如下关系式:
AB+BCDEB+BD=2 * (AB+BD)------(1)
==>AB+BD=BCDEB-----(2)
根据一圈的关系:BD+DB=BCDEB-----(3)
由(2),(3)可得,AB=DB-----(4)
所以,在编程实现时,可记录快慢指针相遇的结点,然后再从头节点开始,当这两个结点相遇即为循环开始的结点。

  • 代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *detectCycle(ListNode *head) 
    {
        ListNode* fast=head;
        ListNode* slow=head;
        bool cycle=false;
        while(fast&&fast->next)
        {
            fast=fast->next->next;
            slow=slow->next;
            if(fast==slow)
            {
                cycle=true;
                break;
            }
        }
        if(cycle)
        {
            ListNode* s=head;
            while(s!=slow)
            {
                s=s->next;
                slow=slow->next;
            }
            return s;
        }
        return NULL;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_42780025/article/details/90766678
今日推荐