輸入兩個鏈表, 找出它們的第一個公共節點。
解體思路
公共結點的意思是相同的點,不僅值相同,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)