题目:输入两个无环的单向链表,找出它们的第一个公共结点,如果没有公共节点则返回空。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)
数据范围:n≤1000
这道题的示例输入输出给我整麻了,看了半天才明白,他这里的公共节点可以理解为两个链表共用第一个公共节点之后的节点(所有?应该吧),要不然怎么会是第一个公共节点,说明后面的也一样
链表日常
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
第一种方法,简单易懂,先把两个链表的长度整出来,得出两者的长度的差值(正的,所以要用abs()函数得到绝对值),先把长的那个遍历n个节点(n是两者长度的差值),因为他们从公共节点开始后面的一定相同,所以较长的那个链表前n个节点绝对没有公共节点,所以要从n个节点之后才开始对比。当两个链表节点相同的时候就是第一个公共节点出现了
class Solution:
def FindFirstCommonNode(self, pHead1, pHead2):
head1 = pHead1
head2 = pHead2
length1 = length2 = 0
while head1:
head1 = head1.next
length1 += 1
while head2:
head2 = head2.next
length2 += 1
if length1 < length2:
pHead1, pHead2 = pHead2, pHead1
distance = abs(length1 - length2)
for i in range(distance):
pHead1 = pHead1.next
while pHead1 != pHead2:
pHead1 = pHead1.next
pHead2 = pHead2.next
return pHead1
第二种方法,相对第一种方法来说更加暴力,当然也更好理解,两层循环,挨着挨着对比有相同的就直接返回节点了
class Solution:
def FindFirstCommonNode(self, pHead1, pHead2):
head1 = pHead1
head2 = pHead2
length1 = length2 = 0
while head1:
head1 = head1.next
length1 += 1
while head2:
head2 = head2.next
length2 += 1
if length1 < length2:
pHead1, pHead2 = pHead2, pHead1
while pHead1:
temp2 = pHead2
while temp2:
if pHead1 == temp2:
return pHead1
temp2 = temp2.next
pHead1 = pHead1.next
return None