160. 相交链表 Golang实现

题目描述:

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。

注意这里的相交节点表示的是值和物理位置都相同的节点,不仅仅是值相同。

思路分析:

假设链表A和链表B的长度分别为lenA和lenB,这个方法的奇妙之处在于,当pA遍历到末尾时(即pA == nil),它会被重定向到headB继续遍历。类似地,当pB遍历到末尾时,它会被重定向到headA继续遍历。这样,当两个指针相遇时,它们已经同步到相同的起点,并指向第一个公共节点。

如果两个链表存在相同的节点,那么在遍历的时候应该遍历完两个链表的长度,直到两个指针相遇。
点击查看代码

func getIntersectionNode(headA, headB *ListNode) *ListNode {
    if headA==nil || headB==nil{
        return nil
    }
    pa,pb := headA,headB
    for pa!=pb {
        if pa!=nil{
            pa = pa.Next
        }else {
            pa = headB
        }

        if pb!=nil{
            pb = pb.Next
        }else {
            pb = headA
        }
    }
    return pa
}