题目要求:
思路:
思路1:常规遍历对比
思路2:转列表处理
思路3:双指针遍历(先走自己再走对方)
代码如下:
思路1代码:
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
#
#
# @param pHead1 ListNode类
# @param pHead2 ListNode类
# @return ListNode类
#
class Solution:
def FindFirstCommonNode(self , pHead1 , pHead2):
if not pHead1 or not pHead2: # 任意链表为空返回空即可
return None
index2 = pHead2
while pHead1: # 依次遍历链表1
pHead2 = index2 # 遍历链表2之前需要将其重新指向头
while pHead2:
if pHead1 == pHead2: # 比对成功后直接返回即可
return pHead1
pHead2 = pHead2.next
pHead1 = pHead1.next
return None
# write code here
思路2代码:
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
#
#
# @param pHead1 ListNode类
# @param pHead2 ListNode类
# @return ListNode类
#
class Solution:
def FindFirstCommonNode(self, pHead1, pHead2):
if not pHead1 or not pHead2:
return None
lists = [] # 将两张链表数据转成列表
while pHead1:
lists.append(pHead1)
pHead1 = pHead1.next
while pHead2:
lists.append(pHead2)
pHead2 = pHead2.next
if len(lists) == len(set(lists)): # 如果去重后大小一致则不存在共同节点
return None
else: # 不一致的话遍历找到
for item in lists:
if lists.count(item) ==2:
return item
# write code here
思路3代码:
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
#
#
# @param pHead1 ListNode类
# @param pHead2 ListNode类
# @return ListNode类
#
class Solution:
def FindFirstCommonNode(self, pHead1, pHead2):
p1 = pHead1
p2 = pHead2
while p1 != p2: # 当相等时退出循环,此时p1=p2=None或p1=p2=共同节点
p1 = p1.next if p1 else pHead2 # p1存在的情况下,将 p1.next属性赋值给p1否则将pHead2赋值给p1
p2 = p2.next if p2 else pHead1
return p1
# write code here