LeetCode 热题 160.相交链表(双指针)

题目

思路:

我们可以用双指针,i 指向a的头,j 指向b的头,然后一个个比较然后不同就往下走,但是这里有个问题,就是可能不同步,i 和 j 经过相交节点的时间可能不同。

我们把

链 A 分为两段:不相交的 a 部分 + 相交的 c 部分

链 B 分为两段:不相交的 b 部分 + 相交的 c 部分

让 i 和 j 分别走 A + B 和 B + A,把路程差补平,我们可以发现:

i 走的路程是 a + c + b + c

j 走的路程是 b + c + a + c

前面的 a + c + b = b + c + a,那么不管 a 和 b 等不等,如果AB相交 i 和 j 总能在某一时刻同时指向相交的点,并且如果没有相交的点,他们也同时指向空。这样代码就很好写了:

复制代码
		if (headA == nullptr || headB == nullptr) return nullptr;  // 只要有一条链表为空,就不可能相交

        ListNode *i = headA, *j = headB;
		//双指针各走 自己的路 + 对方的路,总长度相同,保证同步到达可能的交点
        while (i != j ){
            if(i == nullptr) i = headB;  // 自己的走完了,走对方的
            else i = i -> next;  // 往下走

            if (j == nullptr) j = headA; // 自己的走完了
            else j = j -> next;  // 往下走
        }

        return i;  // 如果相交 同时指向相交的点,不相交,同时指向空,所以直接返回 i 就行
相关推荐
TracyCoder12310 小时前
LeetCode Hot100(27/100)——94. 二叉树的中序遍历
算法·leetcode
九.九10 小时前
CANN HCOMM 底层机制深度解析:集合通信算法实现、RoCE 网络协议栈优化与多级同步原语
网络·网络协议·算法
C++ 老炮儿的技术栈10 小时前
Qt Creator中不写代如何设置 QLabel的颜色
c语言·开发语言·c++·qt·算法
子春一10 小时前
Flutter for OpenHarmony:构建一个 Flutter 数字消消乐游戏,深入解析网格状态管理、合并算法与重力系统
算法·flutter·游戏
草履虫建模16 小时前
力扣算法 1768. 交替合并字符串
java·开发语言·算法·leetcode·职场和发展·idea·基础
naruto_lnq18 小时前
分布式系统安全通信
开发语言·c++·算法
Jasmine_llq19 小时前
《P3157 [CQOI2011] 动态逆序对》
算法·cdq 分治·动态问题静态化+双向偏序统计·树状数组(高效统计元素大小关系·排序算法(预处理偏序和时间戳)·前缀和(合并单个贡献为总逆序对·动态问题静态化
爱吃rabbit的mq19 小时前
第09章:随机森林:集成学习的威力
算法·随机森林·集成学习
(❁´◡`❁)Jimmy(❁´◡`❁)20 小时前
Exgcd 学习笔记
笔记·学习·算法
YYuCChi20 小时前
代码随想录算法训练营第三十七天 | 52.携带研究材料(卡码网)、518.零钱兑换||、377.组合总和IV、57.爬楼梯(卡码网)
算法·动态规划