160. 相交链表

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func getIntersectionNode(headA, headB *ListNode) *ListNode {

}

解决

哈希

暴力破解,将A全部节点加入map,再遍历B节点,如果map中存在,则返回该节点

func getIntersectionNode(headA, headB *ListNode) (ans *ListNode) {
    var headMap = make(map[*ListNode]struct{})
    for headA != nil {
        headMap[headA] = struct{}{}
        headA = headA.Next
    }
    for headB != nil {
        _, ok := headMap[headB]
        if ok {
            return headB
        }
        headB = headB.Next
    }

    return
}

时间复杂度 O(N),空间复杂度 O(N)

双指针

/zh-cn/leetcode/160_%E7%9B%B8%E4%BA%A4%E9%93%BE%E8%A1%A8/image-4.png

func getIntersectionNode(headA, headB *ListNode) (ans *ListNode) {
    if headA == nil || headB == nil {
        return
    }
    p, q := headA, headB
    for p != q {
        if p != nil {
            p = p.Next
        } else { // 如果已经走到最后的空节点
            p = headB // 进入例外一个链表 y
        }
        if q != nil {
            q = q.Next
        } else { // 如果已经走到最后的空节点
            q = headA // 进入例外一个链表 x
        }
    }
    return p
}

时间复杂度 O(N),空间复杂度 O(1)