题目:
160. 相交链表
难度:简单
题目分析:如果没有存储空间限制,可以把其中一个链表存到集合 set() 里面,然后再遍历另一个链表,看是否有节点在集合里面。
巧妙点的方法是使用两个指针。 如果两个链表有相交,那么后面的整个部分,长度是相同的,所以,如果能消除不相交的部分的长度差,那它们之后肯定可以同时到相交点。方法很简单,每个指针都走一遍两个链表!
方法一:使用额外空间
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
if not headA or not headB:
return None
visited = set()
pA = headA
while pA:
visited.add(pA)
pA = pA.next
pB = headB
while pB:
if pB in visited:
return pB
pB = pB.next
return pB
运行效果:
方法二:使用双指针
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
if not headA or not headB:
return None
p1 = headA
p2 = headB
while p1 != p2:
if p1 is not None:
p1 = p1.next
else:
p1 = headB
if p2 is not None:
p2 = p2.next
else:
p2 = headA
return p1 # 如果没有相遇,两个指针会同时到达尾结点
运行结果:
小结:
这类题目,使用了额外空间,其实也多不到哪去……