剑指offer-js 两个链表的第一个公共节点

两个链表的第一个公共节点

题目描述:

输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,
所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)。

问题分析:

有这样几种思路:
	链表中有关的相交就是结点相等。三种方法:
	
	第一种:双重循环,
		遍历第一个链表,然后遍历另一个链表,如果相等,return
		
	第二种:哈希表
		遍历一个链表并且将链表存在哈希表中,而后遍历另一个链表,如果相等,return
		
	第三种:双指针法(使用此方法)
		两条链表,共同的部分为 c,链表a,链表b,
		从头开始,遍历一遍后跳转到另一条链表上去,这样第二圈会相遇,相遇点就是结果
		a+c+b = b+c+a
		这个思想和 Floyd 算法有很多相似之处

代码展示:

//JZ36 两个链表的第一个公共节点
/*function ListNode(x){
    this.val = x;
    this.next = null;
}*/
function FindFirstCommonNode(pHead1, pHead2)
{
    // 双指针算法(后续扩展:有无环)
    // 两个链表有一个交点,那么a链表开头到节点的距离和b链表开头到节点的距离就是关键
    // 虽然距离 a 不一定等于 b 但是,a+b== b+a
    
    let a = pHead1;
    let b = pHead2;
    
    //找到相同节点就结束
    while(a !== b){
        a = a?a.next:pHead2;//走完自己,开始走另一个,这样在长度上就是相同的,逐个走完就行
        b = b?b.next:pHead1;
    }
    return a;
}

扩展

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值