解题思路
思路一:
暴力解法,对于B链表中的每一个节点,都去遍历一次A链表,看A链表是否有与B节点相同的
时间复杂度o(n*m),空间复杂度o(1)
思路二:
反向遍历。A和B从末尾往前走,直到走到一个不一样的,说明此前一个是最后一个一样的(从前看的第一个一样的)。为了从末尾往前,要用到栈,即前向遍历的时候往栈中压入元素,后向遍历的时候从栈中弹出元素。
时间复杂度o(n+m),空间复杂度o(n+m)
思路三:
双指针,但此时A和B链表可能不等长,所以要给他们一个起始等长的位置。方法是先遍历两个链表得到长度L1和L2,让较长的那个先走abs(L1-L2)步,然后再一起往后走直到相同节点。
时间复杂度o(n+m),空间复杂度o(1)
思路四:
延续思路三双指针的想法,思路三虽然可行但代码会很复杂。我们其实可以人为给两个链表创造一个起始等长的位置。对于A链表,我们重塑成B+A,对于B,我们重塑成A+B,然后向后遍历。
时间复杂度o(n+m),空间复杂度o(1)
class Solution:
def FindFirstCommonNode(self , pHead1 , pHead2 ):
p1, p2 = pHead2, pHead1
while p1 != p2:
p1 = p1.next if p1 else pHead1
p2 = p2.next if p2 else pHead2
return p1