JZ36 两个链表的第一个公共结点

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

题目:输入两个链表,找出它们的第一个公共结点。

思路:右对齐两个链表,如果两个链表有公共节点,则它们的形状必然是一个Y字形。

长链表先走,实现右对齐,先假设这两个链表的长度相等,则我们可以同步遍历这两个链表,找到公共节点。现在有两个链表,我们可以先分别求齐长度得其差n,然后遍历长的那个链表n个节点,然后同步遍历这两个链表即可。hashmap存储遍历第一条链的节点,遍历另一条,寻找已经出现的key。

func abs(x int) int {
    if x  < 0 {
        return -x
    }
    return x
}
func FindFirstCommonNode(pHead1, pHead2  *ListNode) *ListNode {
    if pHead1 == nil || pHead2 == nil {
        return nil
    }
    
    p1, p2 := pHead1, pHead2
    len1, len2 := 0, 0
    for p1 != nil {
        len1++
        p1 = p1.Next
    }
    for p2 != nil {
        len2++
        p2 = p2.Next
    }
    p1 = pHead1
    p2 = pHead2
    if len1 < len2 {
         p1 = pHead2
         p2 = pHead1
    }
    for i := 0;i < abs(len1 - len2);i++ {
        p1 = p1.Next
    }
    for p1 != nil && p2 != nil {
        if p1.Val == p2.Val {
            return p1
        } else {
            p1 = p1.Next
            p2 = p2.Next
        }
    }
    return nil
}

 

原文地址:https://www.cnblogs.com/dingxiaoqiang/p/14640933.html