[剑指OFFER]两个链表的第一个公共节点

解题思路:

根据链表属性,若两个链表有公共节点,那从第一个公共节点开始,后面的节点都是一样的,所以两个链表呈Y行分布。

思路是:先计算两个链表的长度,并分别放入堆栈中,再从后往前比较两个链表的节点是否相同,第一个不同节点的next就是第一个相同节点;

注意特殊情况:短的链表的第一个节点为公共节点。

ps:题目——{1,2,3,4}{6,7}{8,9}表示

第一个链表是 {1,2,3,4,8,9}

第二个链表是{6,7,8,9}

class Solution:

    def FindFirstCommonNode(self, pHead1, pHead2):
        # write code here
        if pHead1 and pHead2:
            list1 = []
            list2 = []
            while pHead1:
                list1.append(pHead1)
                pHead1 = pHead1.next
            while pHead2:
                list2.append(pHead2)
                pHead2 = pHead2.next
            for i in range(min(len(list1),len(list2))):
                if list1[-1-i] != list2[-1-i]:
                    return list1[-1-i].next
            if len(list1)<len(list2):
                return list1[0]
            else:
                return list2[0]
        else:

            return None

看了别人的答案,有一个很好:

链接:https://www.nowcoder.com/questionTerminal/6ab1d9a29e88450685099d45c9e31e46
来源:牛客网

有个思路,不需要存储链表的额外空间。也不需要提前知道链表的长度。看下面的链表例子:
0 - 1 - 2 - 3 - 4 - 5 - null
a - b - 4 - 5 - null
代码的ifelse语句,对于某个指针p1来说,其实就是让它跑了连接好的的链表,长度就变成一样了。
如果有公共结点,那么指针一起走到末尾的部分,也就一定会重叠。看看下面指针的路径吧。
p1: 0 - 1 - 2 - 3 - 4 - 5 - null(此时遇到ifelse) - a - b - 4 - 5 - null
p2:  a - b - 4 - 5 - null(此时遇到ifelse) 0 - 1 - 2 - 3 - 4 - 5 - null
因此,两个指针所要遍历的链表就长度一样了!
class Solution:
    def FindFirstCommonNode( self , pHead1, pHead2):
        p1,p2 = pHead1,pHead2
        while p1! = p2:
            p1 = p1. next if p1 else pHead2
            p2 = p2. next if p2 else pHead1
        return p1
把两个链表串起来,那要遍历的长度就相同了。如果有公共节点,根据之前说的,后面的节点都是一样的,那两个整合之后的链表,后面也肯定是一样的。

猜你喜欢

转载自blog.csdn.net/jillian_sea/article/details/80781892