160. 相交链表 JavaScript实现

本文介绍了两种解决160.相交链表问题的方法:哈希表和双指针。哈希表法利用集合存储链表A的所有节点,遍历链表B检查是否存在哈希表中,找到相交节点。双指针法通过同步移动两个指针,直到它们相遇,返回相交节点。这两种方法都避免了多余的遍历,降低了空间复杂度。
摘要由CSDN通过智能技术生成

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、算法分析

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值