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 就行
相关推荐
bubiyoushang8881 天前
雷达目标跟踪中扩展卡尔曼滤波(EKF)算法matlab实现
算法·matlab·目标跟踪
wefg11 天前
【算法】分治
数据结构·算法·排序算法
想唱rap1 天前
归并排序、计数排序以及各种排序稳定性总结
c语言·数据结构·笔记·算法·新浪微博
芒果量化1 天前
ML4T - 第7章第4节 线性回归统计 Linear Regression for Statistics
算法·机器学习·线性回归
敲代码的嘎仔1 天前
牛客算法基础noob56 BFS
java·开发语言·数据结构·程序人生·算法·宽度优先
补三补四1 天前
卡尔曼滤波
python·算法·机器学习·数据挖掘
WaWaJie_Ngen1 天前
LevOJ P2080 炼金铺 II [矩阵解法]
c++·线性代数·算法·矩阵
今后1231 天前
【数据结构】堆、计数、桶、基数排序的实现
数据结构·算法·堆排序·计数排序·桶排序·基数排序
敲代码的嘎仔1 天前
牛客算法基础noob59 简写单词
java·开发语言·数据结构·程序人生·算法·leetcode·学习方法
少许极端1 天前
算法奇妙屋(四)-归并分治
java·算法·排序算法·分治·归并