题目
两个链表的第一个公共节点
一、两个栈
两个链表如果有公共节点,则自第一个公共节点开始,后面的节点全部相同。
def first_node_1(l1, l2):
if not l1 or not l2:
return None
s1 = []
s2 = []
p1 = l1
p2 = l2
while p1:
s1.append(p1)
p1 = p1.next
while p2:
s2.append(p2)
p2 = p2.next
if s1[-1] != s2[-1]:
return None
else:
while s1 and s2 and s1[-1] == s2[-1]:
node = s1.pop(-1)
s2.pop(-1)
return node
二、 一个set
if not l1 or not l2:
return None
s1 = {}
p1 = l1
p2 = l2
while p1:
s1.add(p1)
p1 = p1.next
while p2:
if p2 in s1:
return p2
else:
p2 = p2.next
return None
二、 双指针循环
方法一的耗时感人。
使用双指针循环,总会相遇。
def first_node_2(l1, l2):
if not l1 or not l2:
return None
p1 = l1
p2 = l2
while p1 != p2:
p1 = p1.next if p1 else l2
p2 = p2.next if p2 else l1
return p1