python带你解决两个链表中的公共节点问题

题目描述
输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
解题思路:两个有共同节点的链表是Y型结构,也就是自第一个公共节点开始,都是重合的。题目要求,要找到第一个公共节点,可以反其道而行之,从后往前找,如果是重合节点,这两个节点一定是相等的,所以最后一个相等的节点就是第一个公共的节点。具体方法可以先将每个链表中的节点循环添加到栈中,然后从栈中弹出,一一比较即可

class ListNode(self, x):
	self.val = x
	self.next = None
class Solution:
	def findCommonNode(self, pHead1, pHead2):
		#首先判断是否为空
		if not pHead1 or not pHead2:
			return None
		#两个辅助栈,将数据添加进去
		stack1 = []
		stack2 = []
		while pHead1:
			stack1.append(pHead1)
			pHead1 = pHead1.next
		while pHead2:
			stack2.append(pHead2)
			pHead2 = pHead2.next
		#定义要输出的变量,开始比较栈的值是否一样
		res = None
		while stack1 and stack2:
			p1 = stack1.pop()
			p2 = stack2.pop()
			if p1.val == p2.val:
				res = p1
			else:
				break
		return res
l1 = ListNode(1)
l1.next = ListNode(5)
l1.next.next = ListNode(7)
l1.next.next.next = ListNode(9)
l2 = ListNode(2)
l2.next = ListNode(3)
l2.next.next = ListNode(4)
l2.next.next.next = ListNode(5)
l2.next.next.next.next = ListNode(7)
l2.next.next.next.next.next = ListNode(9)
test = Solution()
test.findCommonNode(l1,l2).val
5

第二种方法:比较两个链表的长度l1和l2,让长的先走|l1-l2|步,然后遍历两个链表,第一个相同的点就是想找的公共节点。

class ListNode:
	def __init__(self, x):
		self.val = x
		self.next = None
class Solution:
	def FindCommonNode(self, pHead1, pHead2):
		#首先判断是否为空
		if not pHead1 or not pHead2:
			return None
		#其次找出长链表
		l1 = 0
		l2 = 0
		h1 = pHead1
		h2 = pHead2
		while h1:
			l1 += 1
			h1 = h1.next
		while h2:
			l2 += 1
			h2 = h2.next
		#开始比较,谁长就让谁先走
		if l1 > l2:
			for i in range(l1-l2):
				pHead1 = pHead1.next
		elif l1 < l2:
			for i in range(l2-l1):
				pHead2 = pHead2.next
		#ok开始遍历
		while pHead1 and pHead2:
			if pHead1.val = pHead2.val:
				return pHead1
			else:
				pHead1 = pHead1.next
				pHead2 = pHead2.next
		return None
l1.next = ListNode(5)
l1.next.next = ListNode(7)
l1.next.next.next = ListNode(9)
l2 = ListNode(2)
l2.next = ListNode(3)
l2.next.next = ListNode(4)
l2.next.next.next = ListNode(5)
l2.next.next.next.next = ListNode(7)
l2.next.next.next.next.next = ListNode(9)
test = Solution()
test.FindFirstCommonNode(l1,l2).val
5

总结:主要是比较两个链表里面的字是相同的即可,可以从后往前找,利用栈先进后出,后进先出的特点,弹出的值最后一个相等的节点就是第一个公共的节点。第二种方法是比较两个链表的长度,让长的先走|l1-l2|步,两个链表同在一起跑线上,第一相等的就是第一个公共点。
你学会了吗?

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值