160. 相交链表 JavaScript实现

68 阅读1分钟

160. 相交链表

160.相交链表 这一题和141.环形链表解法相同

一、哈希表

1、思想在这里插入图片描述

比较节点相同,不仅仅是只比较里面的val值。往哈希表里面存的是节点而不是节点值。所以才会导致示例1的结果。故即便是值相等,也不代表节点相等。是否相等只能通过代码计算知道。

2、代码实现

var getIntersectionNode = function(headA, headB) {
    // 使用一个哈希表去存储链表A的所有节点
    var hash = new Set();
     
    // 遍历链表A,其中headA和headB指的都是头节点,不是指针
    while( headA != null){
        // 存储的是节点的地址而不是值
        hash.add(headA);
        headA = headA.next;
    }
    
    // 遍历链表B,检查链表B中的每个元素是否在哈希表中
    while(headB != null){
        if(hash.has(headB)){
            // 如果存在,则返回相交的起始节点
            return headB;
        }
        headB = headB.next;
    }
    // 遍历结束,没有相交的节点
    return null;       
};

3、算法分析

在这里插入图片描述

二、双指针

将空间复杂度降低

1、思想

双指针实现的思想 -- 图解

在这里插入图片描述

2、代码实现

var getIntersectionNode = function(headA, headB) {
    // 判断其中链表为空的情况,空链表没有相交的节点
    if(!headA || !headB) return null;
    
    // 使用两个指针进行遍历。两个头节点另外的作用
    let pA = headA,pB = headB;
    
    // 开始遍历,遍历结束的条件是pA=pB
    while(pA != pB){
        
        // 链表A移动指针,当第一次遍历结束指向空的时候,就移动到链表B的开头
        if(pA != null){
            pA = pA.next;
        }else{
            pA = headB;
        }
        
         // 链表A移动指针,当第一次遍历结束指向空的时候,就移动到链表B的开头
        if(pB != null){
            pB = pB.next;
        }else{
            pB = headA;
        }      
    }
    // 返回的是最后相交的节点
    return pA;
};

3、算法分析

在这里插入图片描述