Leetcode-142: Linked List Cycle II

基于Claude AI的Dex个人操作系统:从零部署到高效工作流实战 在当今信息过载的时代,个人知识管理(PKM)和任务自动化成为提升效率的关键技术。传统PKM工具如Notion、Obsidian虽然提供了强大的信息存储能力,但本质上是被动的数据库,需要用户手动维护结构和链接,容易形成信息孤岛。其核心原理在于通过预设的文件夹结构和智能路由,实现信息的自动归类与关联。这种自动化同步机制的技术价值在于彻底消除重复劳动和决策疲劳,让用户从繁琐的信息整理中解放出来,专注于高价值思考。在实际应用场景中,它尤其适合需要处理大量会议、任务和人际关系的知识工作者,如产品经理、项目经理和团队领 阅读详情

这题非常经典,其实没见过的话短时间内想出空间复杂度O(1)的解法我觉得不容易。
解法1:用set或map。但要是要求空间复杂度O(1)就不行了。

ListNode *detectCycle(ListNode *head) {

    if (!head) return NULL;
    set<ListNode *> s;

    ListNode* p = head;
    while(p) {
        if (s.count(p)) {
            return p;
        }
        else {
            s.insert(p);
            p=p->next;
        }
    }

    return NULL;
}

解法2:还是快慢指针法,我是参考网上的解法。
这里写图片描述

如图所示,p1和p2都从head出发,p1每次走1步,p2每次走2步,那么当p1和p2在环中某处相遇时,p2已经走s+m+kr, p1走了s+m+lr,也就是说相遇的时候p2和p1所花次数一样,但p2比p1多走了k-l圈。此处l>=0,k>=1, r为一圈周长。
另外我们知道p2走的路应该是p1的两倍,那么有s+m+kr=2(s+m+lr),可推出s+m=(k-2l)r。设n=k-2l,这个n圈实际上就是s+m的距离。

那么我们有s=nr-m。这个说明什么呢?说明如果让p1从head开始,p2从meet place开始,两个每次都只走一步,则p1走了s步,p2走了nr-m步,两者刚好相遇在环的起始点。

代码如下:

#include <iostream>
#include <set>

using namespace std;

struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};

ListNode *detectCycle(ListNode *head) {

    if (!head) return NULL;
    ListNode *p1=head, *p2=head;
    while(p2) {
        p1=p1->next;
        p2=p2->next;
        if (!p2 || !p2->next) return NULL;
        p2=p2->next;

        if (p2==p1)
            break;
    }
    p1=head;
    while(p1 && p2 && p1!=p2) {
        p1=p1->next;
        p2=p2->next;
    }

    return p1;
}

int main()
{
    ListNode a=ListNode(1);
    ListNode b=ListNode(2);
    ListNode c=ListNode(3);
    ListNode d=ListNode(4);
    ListNode e=ListNode(5);
    a.next=&b;
    b.next=&c;
    c.next=&d;
    d.next=&e;
    //e.next=&c;

    ListNode* p = detectCycle(&a);
    if (p)
        cout<<p->val<<endl;

    return 0;
}

我的另一个类似解法如下:

/**
 * Definition of singly-linked-list:
 * class ListNode {
 * public:
 *     int val;
 *     ListNode *next;
 *     ListNode(int val) {
 *        this->val = val;
 *        this->next = NULL;
 *     }
 * }
 */

class Solution {
public:
    /**
     * @param headA: the first list
     * @param headB: the second list
     * @return: a ListNode
     */
    ListNode * getIntersectionNode(ListNode * headA, ListNode * headB) {

        if (!headA || !headB) return NULL;
        
        ListNode * nodeA = headA;
        ListNode * endA = NULL;
        
        while(nodeA && nodeA->next) {
            nodeA = nodeA->next;
        }
        endA = nodeA;
        endA->next = headA;  // construct a circle
        
        ListNode * node1 = headB;
        ListNode * node2 = node1->next;
        ListNode * meetNode = NULL;
        
        while(node1 && node2 && node1->next && node2->next) {
            if (node1 == node2) {
                meetNode = node1;
                break;
            }
            node1 = node1->next;
            node2 = node2->next->next;
        }

        if (!meetNode) {
            endA->next = NULL;
            return NULL;
        }
        
        node1 = meetNode->next;
        node2 = headB;
        while(node1 != node2) {
            node1 = node1->next;
            node2 = node2->next;
        }
        
        endA->next = NULL;
        return node1;
    }
};

解法3:参考九章。
思路很清晰。先两个链表各自遍历,如果最后没走到一起就返回NULL。
然后算好两个链表的长度差,短的从头开始走,长的从长度差那个地方开始 走,走到一起的地方就是交汇点。

代码如下:

class Solution {
public:
    /**
     * @param headA: the first list
     * @param headB: the second list
     * @return: a ListNode
     */
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        // write your code here
        if(headA == NULL || headB == NULL)
            return NULL;
        ListNode* iter1 = headA;
        ListNode* iter2 = headB;
        int len1 = 1;
        while(iter1->next != NULL)
        {
            iter1 = iter1->next;
            len1 ++;
        }
        int len2 = 1;
        while(iter2->next != NULL)
        {
            iter2 = iter2->next;
            len2 ++;
        }
        if(iter1 != iter2)
            return NULL;
        if(len1 > len2)
        {
            for(int i = 0; i < len1-len2; i ++)
                headA = headA->next;
        }
        else if(len2 > len1)
        {
            for(int i = 0; i < len2-len1; i ++)
                headB = headB->next;
        }
        while(headA != headB)
        {
            headA = headA->next;
            headB = headB->next;
        }
        return headA;
    }
};
深入解析雪球网股票行情数据爬取:基于WebSocket与API的实时数据获取技术实践 本文详细介绍了如何使用Python爬虫技术获取雪球网的股票行情数据,涵盖了WebSocket实时数据连接和RESTful API接口调用两种主要技术方案。完整的WebSocket客户端,支持实时行情订阅和数据处理功能丰富的API客户端,支持多种数据类型的获取数据存储和管理系统,使用SQLite进行数据持久化实时监控和预警系统,支持自定义预警规则技术指标计算,提供基本的数据分析功能。 阅读详情

相关推荐

pdf.js 移动端手势缩放功能实现与原生事件集成

本文详细解析了如何为pdf.js的viewer.html移动端页面实现流畅的双指捏合手势缩放功能。通过深入分析pdf.js的缩放机制,并利用原生触摸事件(touchstart、touchmove、touchend)进行集成,在不修改核心源码的前提下,为用户提供媲美原生应用的顺滑缩放体验,有效提升了移动端PDF阅读的专业性和用户满意度。

brandy的博客 488

Leetcode142. Linked List Cycle II

判断链表是否有环,并把环的入口点找到

magic_jiayu的博客 344

SAR动目标检测三剑客:DPCA/ATI/STAP技术选型指南(含2023最新实验数据对比)

本文深入对比了SAR动目标检测三大主流技术DPCA、ATI与STAP的核心原理与性能差异。基于2023年最新实验数据,分析了它们在最小可检测速度、测速精度、计算复杂度及对通道失配敏感度等方面的优劣,并结合海洋监视与城市交通监控等典型场景,提供了具体的技术选型指南与工程落地考量。

m5n6o7的博客 292

[Leetcode力扣 142] Linked List Cycle II

一、题目描述 给一个链表,如果里面有环,输出环的起点,否则输出空指针 二、解法一:判断节点对应的指针是否出现过 这是最容易想到的解法,因为一个节点的地址可以唯一确定这个节点,只要沿着链表移动,看节点对应的地址是否出现过就行了,unordered_set比set查找快一点,所以可以用unordered_set。代码如下: /** * Definition for singly-linked list. * struct ListNode { * int val; * Li

NiuYutao的博客 308

Python爬虫实战:绕过B站-352风控的完整解决方案

网络爬虫技术是数据采集和自动化测试的重要工具,其核心原理是通过模拟HTTP请求获取网页数据。在实践过程中,开发者常会遇到网站反爬机制,这涉及请求指纹识别、IP行为分析等安全技术。这些风控措施的价值在于保护网站数据安全和服务器资源,广泛应用于电商、社交、内容平台等场景。针对B站等平台的-352风控错误,需要综合运用请求头伪装、会话管理、参数签名破解等技术方案。本文重点探讨如何通过构建完整的浏览器级请求头、管理Cookie会话、以及使用Playwright等浏览器自动化工具,有效解决Python爬虫在B站数据采

weixin_33912638的博客 391

Google账号找回通用方法(尤其是知道账号密码仍无法登录和找回的)

Google账号找回通用方法【尤其是知道账号密码仍无法登录和找回的】普通找回注意:适用于常用谷歌账户的设备和网络情况下无法使用手机或辅助邮箱验证码进行密码找回特殊找回方法注意;适用于1.新的设备以及网络环境(包括由于非正常原因导致设备系统以及应用信息变更)2.没有开启辅助验证(手机/邮箱)3.知道账号密码但无法登录或找回。通过申诉进行找回 普通找回 注意:适用于 常用谷歌账户的设备和网络情况下 无法使用手机或辅助邮箱验证码进行密码找回 通过恢复页面进行恢复 https://accounts.google

极客代码-极致生活 23万+

Leetcode 142 Linked List Cycle II

Leetcode 142 Linked List Cycle II Given a linked list, return the node where the cycle begins. If there is no cycle, return null. To represent a cycle in the given linked list, we use an integer pos w...

博学 笃志 切问 近思 267

【项目实战】Qt6 录制屏幕、录制声音生成MP4、AVI、MA3等(完整源码,可直接编译使用)

本文将详细介绍如何利用Qt6多媒体模块中的QMediaCaptureSession、QMediaRecorder、QScreenCapture、QAudioInput、QMediaFormat等功能,实现对屏幕和声音的录制,并生成常见的媒体格式文件,如MP4、AVI、MA3等。我们将探讨如何利用这些功能来实现灵活的视频和音频参数设置,以满足不同需求下的录制和生成要求。我们将重点讨论如何配置视频和音频参数,包括分辨率、帧率、编解码器选择、音频采样率、声道设置等。

yegu001的博客 4939

NYUer | LeetCode142 Linked List Cycle II

NYUer | LeetCode142 Linked List Cycle II

Moses_SU的博客 244

面向企业级应用的 SAP UI5 troubleshooting 全景指南:从日志与调试到性能与可测试性

本指南系统化介绍了SAP UI5应用排错的完整流程和工具链。从基础的浏览器开发者工具使用,到SAP UI5专用调试工具(Technical Information Dialog、Support Assistant、Diagnostics Window),再到性能优化和日志管理,提供了一套工程化的解决方案。重点推荐组合使用UI5 Inspector扩展、Test Recorder测试工具以及性能测量模块,并强调将常见问题整理成团队知识库。通过制度化的排错步骤和工具组合,开发者可以快速定位、复现和修复问题,将调

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 280

手把手教你学Simulink——基于Simulink的PR(比例谐振)控制器在单相整流中的应用

本文详细介绍了基于Simulink的PR(比例谐振)控制器在单相整流系统中的应用。通过与传统PI控制器的对比,阐述了PR控制器在交流信号跟踪中的优势:可实现50Hz正弦电流的无静差跟踪,THD低于2%,功率因数接近1。文章从PR控制器原理出发,提供了Simulink建模的具体步骤,包括主电路搭建、电压外环设计、PR控制器实现方法(推荐MATLAB Function方式)以及SPWM调制。通过仿真验证了PR控制在稳态和负载突变情况下的优越性能,并探讨了工程实践中的电网频率自适应、多谐振PR等关键技术。该教程为

MHD0815的博客 123

LeetCode 142. Linked List Cycle II(环形链表II) -- c语言

142. Linked List Cycle II Given a linked list, return the node where the cycle begins. If there is no cycle, return null. To represent a cycle in the given linked list, we use an integer pos which rep...

d_benhua的博客 427

智能车浅谈——手把手让车跑起来(电磁篇)

手把手让你的电磁车上路。

qq_41954556的博客 7万+

LeetCode-142. Linked List Cycle II [C++][Java]

Given theheadof a linked list, returnthe node where the cycle begins. If there is no cycle, returnnull.

贫道绝缘子的博客 267

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

LeetCode 142 Linked List Cycle II

142 Linked List Cycle II https://leetcode.com/problems/linked-list-cycle-ii/ Given a linked list, return the node where the cycle begins. If there is no cycle, return null. There is a cycle in a linked list if there is some node in the list that can be rea

cyberickk blog 221

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

【leetcode-Python】-快慢指针-142. Linked List Cycle II

题目链接 https://leetcode.com/problems/linked-list-cycle-ii/ 题目描述 给定一个链表,如果链表中有环,返回链表中环的起始位置。如果没有环则返回null。 示例 给定链表: 输出:1(索引为1的节点为环的起点) 解题思路 首先我们通过【leetcode-Python】-快慢指针-141. Linked List Cycle判断链表中是否有环,fast指针一次走两步,slow指针一次走一步,如果发现fast指针和slow指针相遇则跳出.

gulaixiangjuejue的博客 350

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

LeetCode 142. Linked List Cycle II 题解

本题是链表的经典问题,主要考察对链表操作和双指针技巧的理解和应用。通过使用快慢指针,我们可以不仅检测链表中是否存在环,还可以找到环的入口。双指针的核心思想是:通过让快指针以两倍的速度移动,当链表中存在环时,快指针最终会追上慢指针。然后将其中一个指针重置到链表头部,以相同的速度移动两个指针,它们再次相遇的点就是环的入口。这种方法不仅适用于环形链表 II 问题,还可以应用于许多其他链表相关的问题,例如相交链表、链表中点查找等。掌握双指针技巧,对于解决链表问题非常重要。

cannonjinx的博客 4108

[LeetCode][142] Linked List Cycle II

[LeetCode][142] Linked List Cycle II lower 和faster 如果有重合就说明有环 当有环时候 头节点到入口点为L1 入口点到会合点是L2 循环长度为c 第一次快慢指针相遇是进行了n轮的循环 lower长度是L1+L2 faster长度是L1+L2+nc 由此第二次遇到后可以求出c 因为faster每次走两步 lower每次走一步 因此 (L1+L2 )2=...

OCEANtroye的博客 253

LeetCode 142 Linked List Cycle II 题解

LeetCode 142 Linked List Cycle II题意思路代码 题意 判断给出的链表中是否包含环,如果有的话返回环的起始点,否则返回null。如下环起始位置为c a->b->c->d ↑ ↓ f<-e 思路 双指针一个一次一步,一个一次两步可以进入环中,但问题在于如何找到环的起始位置,下面是从讨论版找到的图,可以参考一下: 代码...

EricJeffrey的博客 294

LeetCode 142. Linked List Cycle II

LeetCode 142. Linked List Cycle II 142.Linked List Cycle II Given a linked list, return the node where the cycle begins. If there is no cycle, returnnull. To represe...

豆子 155

Leetcode 142. Linked List Cycle II

题目: Given a linked list, return the node where the cycle begins. If there is no cycle, returnnull. To represent a cycle in the given linked list, we use an integerposwhich represents the position...

Lin_QC的博客 5865

Leetcode 141 Linked List Cycle and Leetcode 142 Linked List Cycle II

可以用快慢指针来确定,由于快的那个指针一直在环中移动,慢的指针每次移动一步,二者一定会相遇,如果能相遇则说明有环。第二步假设从链表头到环的起点距离为a,相遇点为c,那么一定满足a+c+kb = 2(a+c),则满足a+c = kb,也就是说如果一个指针从链表头开始,另一个指针从相遇点开始走,那么两者相遇的点就是环的起点。给定一个环形链表,求找到链表的环的位置,返回一个指针(以Leetcode 142为例)

xxxmmc的博客 816

Leetcode 142. Linked List Cycle II (Medium) (cpp)

Leetcode 142. Linked List Cycle II (Medium) (cpp)

还是需要多学习!闷声大发财,这是坠吼的! 763
上一篇: Leetcode-141: Linked List Cycle
下一篇: Leetcode-101: Symmetric Tree
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值