剑指offer52 两个链表的第一个公共节点
原创
©著作权归作者所有:来自51CTO博客作者小怡情ifelse的原创作品,请联系作者获取转载授权,否则将追究法律责任
输入两个链表, 找出它们的第一个公共节点。
解体思路
公共结点的意思是相同的点,不仅值相同,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)