方法1:暴力法
时间复杂度 :O(m×n)
空间复杂度:O(1)
python
# encoding = utf-8
# 开发者:Alen
# 开发时间: 13:10
# "Stay hungry,stay foolish."
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
# 暴力破解 超出时间限制
class Solution(object):
def getIntersectionNode(self, headA, headB):
"""
:type head1, head1: ListNode
:rtype: ListNode
"""
# 2026 - 1 - 5 错题集
currentA = headA
while currentA: # 遍历到最后currentA为None,while currentA:为False,循环退出
currentB = headB
while currentB:
if currentA == currentB:
return currentA
currentB = currentB.next
currentA = currentA.next
return None
方法2:哈希表法
时间复杂度 :O(m+n)
空间复杂度:O(m) 或 O(n)
python
# encoding = utf-8
# 开发者:Alen
# 开发时间: 13:10
# "Stay hungry,stay foolish."
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
# 哈希表法
class Solution(object):
def getIntersectionNode(self, headA, headB):
"""
:type head1, head1: ListNode
:rtype: ListNode
"""
# 2026 - 1 - 5 错题集
seen = set()
currnt = headA
while currnt:
seen.add(currnt)
currnt = currnt.next
currnt = headB
while currnt:
if currnt in seen:
# if current in seen_list 这个操作在列表中是线性查找(O(m)),导致整体复杂度为 O(m×n),效率低下。
return currnt
currnt = currnt.next
return None
方法3:双指针法
时间复杂度 :O(m+n)
空间复杂度:O(1)
python
# encoding = utf-8
# 开发者:Alen
# 开发时间: 13:10
# "Stay hungry,stay foolish."
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
# 双指针法
class Solution(object):
def getIntersectionNode(self, headA, headB):
"""
:type head1, head1: ListNode
:rtype: ListNode
"""
# 2026 - 1 - 5 错题集
p1, p2 = headA, headB
while p1 != p2:
if p1:
p1 = p1.next
else:
p1 = headB
if p2:
p2 = p2.next
else:
p2 = headA
# 相交点或null(不相交时pA/pB均为null)
return p1
结果
解题步骤1:www.youtube.com
解题步骤2:www.bilibili.com
