剑指 day 3【JZ52 两个链表的第一个公共结点】增加链表长度以使双指针起效

剑指 day 3【JZ52 两个链表的第一个公共结点】增加链表长度以使双指针起效

解题思路

思路一:

暴力解法,对于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

剑指 day 3【JZ52 两个链表的第一个公共结点】增加链表长度以使双指针起效

上一篇:设计模式第一讲--设计模式简介


下一篇:PuyoPuyo DFS算法练习