题目
给你两个单链表的头节点 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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。