两个链表的第一个公共

113 阅读1分钟

描述 :

输入两个无环的单向链表,找出它们的第一个公共结点,如果没有公共节点则返回空。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)

方法一: 哈希集合

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
}

\