python 找出两个链表中第一个公共节点(两个链表如果有一个节点相同,后面的节点会都相同)

'''
前提:两个链表如果有一个节点相同,则后面的所有节点肯定也一样
思路:利用栈的特性(从尾节点开始),循环判断栈尾元素是否相同,相同则pop()
link_list1:100->200->300->400->None
link_list2:666->888->300->400->None
'''
class Node:
	def __init__(self,value):
		self.value = value
		self.next = None

class Solution:
	def get_first_public_node(self,head1,head2):
		#使用两个栈(后进先出),用来存放两个链表中的所偶遇节点
		stack1 = []
		stack2 = []
		
		#加到栈中去
		while head1:
			stack1.append(head1)
			head1 = head1.next
		while head2:
			stack2.append(head2)
			head2 = head2.next
		#存放第一个公共节点的
		node = None
		#当两个栈不为空,且最后1个节点相同,则弹出继续往前找
		while stack1 and stack2 and stack1[-1] is stack_2[-1]:
			#用变量node记录下这个相同节点
			node = stack1.pop()
			stack2.pop()	

		return node
		
if __name__ == '__main__':
	s = Solution()
	#创建节点
	p1 = Node(100)
	p2 = Node(200)
	p3 = Node(300)
	p4 = Node(400)
	p5 = Node(666)
	p6 = Node(888)
	#将结点连接成链表
	#链表1:100 200 300 400
	p1.next = p2
	p2.next = p3 
	p3.next = p4
	#链表2:666 888 300 400
	p5.next = p6
	p6.next = p3
	p3.next = p4
	#打印出第一个公共节点:300
	node = s.get_first_public_node(p1,p5)
	print(node.value)				
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值