每日leetcode——160. 相交链表

题目

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

题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。

输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,6,1,8,4,5], skipA = 2, skipB = 3
输出:Intersected at '8'
解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。
从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,6,1,8,4,5]。
在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。

哈希表

最简单的思路,遍历链表A,把每个节点存在一个字典(hash表)中。
再遍历字典B,看B的当前节点是否在字典中,存在的话就是相交节点。

双指针

定义两个指针A,B,分别从各自的链表表头开始遍历,
如果两个指针指向的节点不同,就继续向后移动
如果两个指针指向的节点相同,则找到了相交节点,包括两个不相交的链表,两个指针最终都会移动到尾部节点指向的None,则也会返回None
当某个指针移动到链表末尾时,跳转到另一个链表的表头开始遍历,这样做能保证两个不对称的相交链表,经过指针移动,最终总能同时移动到相交节点上

def getIntersectionNode(headA,headB):
    if not headA or not headB:
        return None

    A,B = headA,headB
    while A!=B:
        A = A.next if A else headB
        B = B.next if B else headA
    return A

你可能感兴趣的:(数据结构与算法)