返回

面试官提醒:掌握这些技巧,让你轻松解决链表相交问题

前端

前言

在 LeetCode 的面试中,链表相交问题经常被问到。它是一个经典的算法和数据结构问题,要求你找到两个单链表的相交节点。看似复杂,但如果你掌握了正确的方法,就可以轻松地解决这个问题。

问题

给你两个单链表的头节点 headA 和 headB,它们可能相交也可能不相交。如果相交,则返回相交节点。如果没有相交,则返回 null。

为了帮助你更好地理解问题,请考虑以下示例:

  • 示例 1:
headA = [4, 1, 8, 4, 5]
headB = [5, 0, 1, 8, 4, 5]
输出:8
解释:链表 A 和 B 相交于节点 8
  • 示例 2:
headA = [1, 9, 1, 2, 4]
headB = [3, 2, 4]
输出:2
解释:链表 A 和 B 相交于节点 2。
  • 示例 3:
headA = [2, 6, 4]
headB = [1, 5]
输出:null
解释:链表 A 和 B 不相交。

解题思路

解决链表相交问题的关键是要找到一种方法来确定两个链表是否相交,以及如果相交,则找到相交的节点。有以下几种思路:

  • 哈希表法:将一个链表的节点值存储在一个哈希表中,然后遍历另一个链表,如果某个节点的值在哈希表中,则两个链表相交,并且相交的节点是该节点。

  • 双指针法:让两个指针分别从两个链表的头节点开始,同时向后移动。如果两个指针相遇,则两个链表相交,并且相交的节点是相遇的节点。

  • 虚拟头节点法:在两个链表的头节点之前添加一个虚拟头节点,然后让两个指针分别从两个虚拟头节点开始,同时向后移动。如果两个指针相遇,则两个链表相交,并且相交的节点是相遇的节点。

代码实现

使用双指针法解决链表相交问题,代码如下:

def get_intersection_node(headA, headB):
  """
  :type headA: ListNode
  :type headB: ListNode
  :rtype: ListNode
  """
  # 如果其中一个链表为空,则两个链表不相交
  if not headA or not headB:
    return None

  # 让两个指针分别从两个链表的头节点开始
  p1 = headA
  p2 = headB

  # 同时向后移动两个指针
  while p1 != p2:
    # 如果一个指针到达链表的末尾,则将其指向另一个链表的头节点
    if p1 is None:
      p1 = headB
    else:
      p1 = p1.next

    if p2 is None:
      p2 = headA
    else:
      p2 = p2.next

  # 如果两个指针相遇,则两个链表相交,并且相交的节点是相遇的节点
  return p1

总结

掌握了正确的思路和方法,解决链表相交问题就变得非常简单。在 LeetCode 的面试中,你可能会遇到各种各样的链表问题,因此掌握这些技巧对你的成功非常重要。