160. 相交链表

题目描述

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。

题目解释

image

参考代码

const getIntersectionNode = function(headA, headB) {
    let p1 = headA,p2= headB
    while(p1!==p2){
        p1=p1==null?headB:p1.next
        p2=p2==null?headA:p2.next
    }
    return p2
};

解释

使用两个指针同时开始前进,如何判断相交,关键问题是两个链表的长度又不一定相等。因此我们可以换一种思路:

解决这个问题的关键是,通过某些方式,让 p1 和 p2 能够同时到达相交节点 c1。所以,我们可以让 p1 遍历
完链表 A 之后开始遍历链表 B,让 p2 遍历完链表 B 之后开始遍历链表 A,这样相当于「逻辑上」两条链表接
在了一起。如果这样进行拼接,就可以让 p1 和 p2 同时进入公共部分,也就是同时
到达相交节点 c1。如果想不通可以自己画图看一下。

总结双指针的用法,还是非常有用的,比如快慢指针的使用,判断是否成环等。

posted @ 2022-10-13 22:16  含若飞  阅读(13)  评论(0编辑  收藏  举报