问题描述 链接到标题

142.环形链表II

解题思路 链接到标题

判断是否链表是否存在环的方式与141.环形链表一致,当两个指针相遇时,再让一个指针从虚拟头节点开始一个节点一个节点的遍历,slow指针也是,两个指针会在环的入口处相遇。

代码 链接到标题

class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        ListNode *vhead = new ListNode(0, head);
        ListNode *fast = vhead, *slow = vhead;
        while (fast != nullptr && fast->next != nullptr) {
            fast = fast->next->next;
            slow = slow->next;
            if (fast == slow) {
                while (vhead != slow) {
                    vhead = vhead->next;
                    slow = slow->next;
                }
                delete vhead;
                return slow;
            }
        }
        return nullptr;
    }
};