题目:输入两个无环的单链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
链表内存储的结点包括:当前结点的值和下一个结点的信息。
因此两个链表的第一个公共结点之后的所有结点都是相同的,就好像一个Y型的结构。
方法一:
将其中一个链表中所有的结点都保存在一个列表中,然后对第二个链表进行遍历,第一个出现在该列表中的结点就是两个链表的第一个公共节点。
class Solution:
def FindFirstCommonNode(self , pHead1 , pHead2 ):
# write code here
list_1 = []
while pHead1:
list_1.append(pHead1)
pHead1 = pHead1.next
while pHead2:
if pHead2 in list_1:
return pHead2
pHead2 = pHead2.next
方法二:
利用栈结构,将两个链表都先分别保存到两个栈当中,同时执行出栈操作,第一次出现的两个不同结果时,前一个出栈的结点就是两个链表的第一个公共结点。
class Solution:
def FindFirstCommonNode(self , pHead1 , pHead2 ):
# write code here
list_1 = []
list_2 = []
while pHead1:
list_1.append(pHead1)
pHead1 = pHead1.next
while pHead2:
list_2.append(pHead2)
pHead2 = pHead2.next
if len(list_1) > len(list_2):
number = len(list_2)
else:
number = len(list_1)
last_node = None
while list_1 and list_2 and list_1[-1] == list_2[-1]:
last_node = list_1.pop()
list_2.pop()
return last_node
方法三:
首先获取两个链表的长度,让较长的链表的指针走到与较短链表头部相同的位置,这样两个链表当前指针所在位置与尾端之间的距离相同,就可以采用逐个比较的方法,进而找到第一个公共结点。
class Solution:
def FindFirstCommonNode(self , pHead1 , pHead2 ):
# write code here
current_1 = pHead1
len_1 = 0
while current_1:
len_1 += 1
current_1 = current_1.next
current_2 = pHead2
len_2 = 0
while current_2:
len_2 += 1
current_2 = current_2.next
if len_1 > len_2:
for i in range(len_1 - len_2):
pHead1 = pHead1.next
else:
for i in range(len_2 - len_1):
pHead2 = pHead2.next
while pHead1:
if pHead1 == pHead2:
return pHead1
else:
pHead1 = pHead1.next
pHead2 = pHead2.next