给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。
图示两个链表在节点 c1 开始相交:
题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。
解法一:走过彼此的路(132ms/29.6MB)
https://leetcode-cn.com/problems/intersection-of-two-linked-lists/solution/intersection-of-two-linked-lists-shuang-zhi-zhen-l/
class Solution:
def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
if not headA or not headB:
return None
A, B = headA, headB
while A != B:
A = A.next if A else headB
B = B.next if B else headA
return A
解法二:哈希表(128ms/30.1MB)
对暴力解法的一个优化方案是:先将其中一个链表存到哈希表中,此时再遍历另外一个链表查找重复结点只需 O(1)时间。
class Solution:
def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
s = set()
p, q = headA, headB
while p:
s.add(p)
p = p.next
while q:
if q in s:
return q
q = q.next
return None
解法三:栈(152ms/29.6MB)
两个链表从公共结点开始后面都是一样的,若是我们顺着链表从后向前查找,很容易就能查找到链表的公共结点(第一个不相同的结点的下一个结点即所求)
class Solution:
def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
s1, s2 = [], []
p, q = headA, headB
while p:
s1.append(p)
p = p.next
while q:
s2.append(q)
q = q.next
ans = None
i, j = len(s1) - 1, len(s2) - 1
while i >= 0 and j >= 0 and s1[i] == s2[j]:
ans = s1[i]
i, j = i - 1, j - 1
return ans
力扣 (LeetCode)链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-medium/xv02ut/