【JS】链表相交如何找交点?

思路

  1. 计算两个链表的长度:使用一个辅助函数(如 getListLen)遍历每个链表,计算它们的长度。

  2. 确定较长链表:比较两个链表的长度,找出哪个链表更长。

  3. 对齐两个链表的遍历起点:让较长链表的指针先走,走的距离是两个链表长度的差值,这样两个指针就会在它们各自链表的相同位置开始遍历。这里目的是对齐指针位置,即让两个链表的末尾位置对齐

  4. 同步遍历两个链表:从对齐后的起点开始,同时遍历两个链表,直到找到交点或者两个指针都到达链表的末尾。

  5. 返回结果:如果两个链表有交点,返回交点节点;如果没有交点,返回 null

题目

示例代码


// 定义一个函数,用于计算链表的长度
var getListLen = function(head) {
    let len = 0, cur = head; // 初始化长度为0,cur指向链表头节点
    while(cur) { // 遍历链表直到cur为null
       len++; // 每遍历一个节点,长度加1
       cur = cur.next; // cur指向下一个节点
    }
    return len; 
}

// 定义一个函数,用于找出两个链表的交点
var getIntersectionNode = function(headA, headB) {
    // 初始化两个指针分别指向两个链表的头节点
    let curA = headA, curB = headB, 
        lenA = getListLen(headA),   
        lenB = getListLen(headB);   

    //把较长的链表统一放在A
    // 如果链表A比链表B长,则交换两个链表的指针和长度
    if(lenA < lenB) {  
    //这里采用es6的解构赋值     
        [curA, curB] = [curB, curA]; // 交换两个链表的头节点
        [lenA, lenB] = [lenB, lenA]; // 交换两个链表的长度
    }

    // 计算两个链表长度的差值
    let i = lenA - lenB;   
    // 让curA先走i步,使得curA和curB在同一起点上(末尾位置对齐)
    while(i-- > 0) {       
        curA = curA.next;
    }

    // 同时遍历两个链表,直到curA和curB相遇或者都到达链表末尾
    while(curA && curA !== curB) {  
        curA = curA.next; 
        curB = curB.next; 
    }

    // 如果curA和curB相遇,则返回交点节点;否则,返回null
    return curA;
};

欢迎指正! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值