• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

RomanLin

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

【Floyd判圈法】LeetCode 142. 环形链表 II

题目

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

题解

用快慢指针的思路进行思考,不妨设 \(p\) 为慢指针,每次移动一步,\(q\) 为快指针,每次移动两步,且初始状态均处于头节点 \(head\) 的位置。

若链表无环,易知快指针 \(q\) 最终会变为 NULL。

若有环,则慢指针 \(p\) 和快指针 \(q\) 必定会在某个节点相遇。此时让其中一个指针再次指向头节点 \(head\) 的位置,然后让快慢指针都以每次移动一步的速度进行移动,再次相遇的节点就是环的入口结点。

参考代码

/**
 * 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* p = head, *q = head;
        while (q && q -> next) {
            p = p -> next;
            q = q -> next -> next;
            if (p == q) break;
        }
        if (!q || !q -> next) return NULL;
        q = head;
        while (q != p) {
            p = p -> next;
            q = q -> next;
        }
        return q;
    }
};

posted on 2025-04-27 19:40  RomanLin  阅读(7)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3