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 就行