题目:给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。
分析: 根据提示 A和B链表的长度分别为 m n
① 有共同节点时
我们希望达成的是通过一轮遍历 判断A B的内容是否相等 然后返回相交点 怎么样才能做到相等长度的遍历呢?
(例: A:a1→a2→c1→c2→c3 B:b1→b2→b3→c1→c2→c3)
用 p1 遍历A遍历B a1→a2→c1→c2→c3→b1→b2→b3→c1→c2→c3
用 p2 遍历B遍历A b1→b2→b3→c1→c2→c3→a1→a2→c1→c2→c3
我们会发现 m+n-k = n+m-k 所以可知 在同时便利p1和p2,当第一次p1 = p2时,对应的节点就是相交节点。
② 无共同节点时
我们设置一个标志,如遍历完A之后遍历B,改变标志的值 如果还会进行第二次遍历 则代表没有公共节点
复杂度: 时间复杂度O(m+n) 空间复杂度O(1)
代码:
def getIntersectionNode(headA, headB):
p1, p2 = headA, headB
flag = 0
while p1 != p2:
if not p1.next:
if flag == 0:
p1 = headB
flag = 1
else:
return None
else:
p1 = p1.next
if not p2.next:
p2 = headA
else:
p2 = p2.next
return p1
路虽远,行则将至。事虽难,做则必成