描述 :
输入两个无环的单向链表,找出它们的第一个公共结点,如果没有公共节点则返回空。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
方法一: 哈希集合
function FindFirstCommonNode(pHead1, pHead2){
if(pHead1==null||pHead2==null) return
let temp=pHead1,hashSet=new Set()
while(temp){
hashSet.add(temp)
temp=temp.next
}
temp=pHead2
while(temp){
if(hashSet.has(temp)){
return temp
}
temp=temp.next
}
return null
}
方法二: 双指针
思路和算法
1.当链表pHead1和链表pHead2都存在时,创建指针p1,p2且都指向两个链表的头节点
2.将两个指针依次遍历两个链表的每个节点
3.当有一个链表遍历完指针为空时,将指针指向另外一个链表的头部
4.判断两个指针是否相等,如果两个指针相等则得到链表相交的节点,若两个链表不想交,则两指针最终都指向空
function FindFirstCommonNode(pHead1, pHead2){
if(pHead1==null||pHead2==null) return null
let p1=pHead1,p2=pHead2
while(p1!=p2){
p1=p1==null? pHead2 : p1.next
p2=p2==null? pHead1 : p2.next
}
return p1
}
\