题目描述
输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
解题思路:两个有共同节点的链表是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|步,两个链表同在一起跑线上,第一相等的就是第一个公共点。
你学会了吗?