LeetCode 142 环形链表 II

LeetCode 142 环形链表 II

🟡 中等 https://leetcode.cn/problems/linked-list-cycle-ii/description/

判断有无环

设置快慢指针,while 的条件只用判断fast 和 fast->next 即可:因为 fast 一定在 slow 右侧。

/**

 * 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* slow = head;

        ListNode* fast = head;

        bool flag = false;

        while(fast&&fast->next){

            slow = slow->next;

            fast = fast->next->next;

            if(fast==slow){

                flag = true;

                break;

            }

        }


    }

};

计算入口

F:快节点路程
S:慢节点路程
b:环的长度
F = S+nb
F = 2S
可得:S = nb

又:设入口距离为 a

则当某一节点路程为 a+nb 时,该节点一定位于入口处。
因此 令fast为head, slow不变,两个重新一起走,最后一定在入口处相遇。
/**

 * 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* slow = head;

        ListNode* fast = head;

        bool flag = false;

        while(fast&&fast->next){

            slow = slow->next;

            fast = fast->next->next;

            if(fast==slow){

                flag = true;

                break;

            }

        }

        int pos = 0;

  

        if(!flag){

            return nullptr;

        }else{

            fast = head;

            while(fast!=slow){

                pos++;

                fast = fast->next;

                slow = slow->next;

            }

            return fast;

        }

    }

};