剑指offer52 两个链表的第一个公共节点

输入两个链表, 找出它们的第一个公共节点。

解体思路

公共结点的意思是相同的点,不仅值相同,next也相同,包括公共结点后面的节点也是完全相同,所以可以把两条链表看成Y字型了,某一个结点后面的点全部一样。例如3->2->1和4->2->1,2就是他们的第一个公共结点。

我们先把全部结点分别压入两个栈,利用栈的特性后进先出特性,同时pop出栈,一开始两边的元素肯定是相同的,当遇到不同的元素时,肯定已经遇到了最后一个节点,那就结束找到commonNode

class LinkNode():
    def __init__(self):
        self.value = None
        self.next = None

class Solution():
    def creatLinkA(self) -> LinkNode:
        node1 = LinkNode()
        node1.value = 3
        node1.next = None

        node2 = LinkNode()
        node2.value = 2
        node2.next = node1

        node3 = LinkNode()
        node3.value = 1
        node3.next = node2

        return  node3

    def creatLinkB(self) -> LinkNode:
        node1 = LinkNode()
        node1.value = 3
        node1.next = None

        node2 = LinkNode()
        node2.value = 2
        node2.next = node1

        node3 = LinkNode()
        node3.value = 5
        node3.next = node2

        return  node3

    def searchFirstLinkNode(self, headA:LinkNode, headB:LinkNode) ->LinkNode:
        if headA is None: return None
        if headB is None: return None
        listA = []
        listB = []
        while headA is not None:
            listA.append(headA)
            headA = headA.next

        while headB is not  None:
            listB.append(headB)
            headB = headB.next

        commonNode = None
        while listB and listA:
            nodeB = listB.pop()
            nodeA = listA.pop()

            if nodeA.value != nodeB.value:
                return commonNode
            else:
                commonNode = nodeA
        return None

solu = Solution()
headA = solu.creatLinkA()
headB = solu.creatLinkB()
endNode = solu.searchFirstLinkNode(headA,headB)
print(endNode.value)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章