两个链表的第一个公共节点
题目描述:
输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,
所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)。
问题分析:
有这样几种思路:
链表中有关的相交就是结点相等。三种方法:
第一种:双重循环,
遍历第一个链表,然后遍历另一个链表,如果相等,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;
}
扩展
- 关于环形链表,其使用的Floyd算法有很多可以学习的地方
- 环形链表1-- 判断是否有环
- 环形链表2 – 判断是否有环并返回入口节点