题目描述
输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
方法一:分别遍历链表获取长度,然后将长的链表先遍历掉多余的结点,再同时遍历两个结点,直到找到第一个相同的结点。
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def FindFirstCommonNode(self, pHead1, pHead2):
#找到第一个两个链表结点next指针指向相同的指针
if pHead1==None or pHead2==None:
return None
p=pHead1
q=pHead2
len1=len2=0
while p:
p=p.next
len1+=1
while q:
q=q.next
len2+=1
p=pHead1
q=pHead2#这里最开始是定义在判断内的,但这样会导致其中有一个结点没有复位,从而只能输出None
if len1>len2:
while len1-len2:
p=p.next
len1-=1
else:
while len2-len1:
q=q.next
len2-=1
while p and q:
if p is q:#判断两个变量是否指向同一对象用is
return p
p=p.next
q=q.next
return None
方法二:用栈,遍历链表时依次存入栈中,然后将两个栈中元素依次同时出栈,用ret保存相同结点,当找到第一个不相同的结点时得到第一个公共结点ret。
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def FindFirstCommonNode(self, pHead1, pHead2):
#找到第一个两个链表结点next指针指向相同的指针
if pHead1==None or pHead2==None:
return None
stack1=[]
stack2=[]
p=pHead1
q=pHead2
ret=None
while p:
stack1.append(p)
p=p.next
while q:
stack2.append(q)
q=q.next
length=min(len(stack1),len(stack2))
i=0
for i in range(length):
p=stack1.pop()
q=stack2.pop()
if p is q:
ret=p
else:
break
return ret