劍指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)

 

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