返回

直击LeetCode 160:巧解相交链表,剖析经典算法

前端

[LeetCode 160] 相交链表

题干

给你两个单链表的头节点 headAheadB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null

图示两个链表在节点 c1 开始相交:

[图片]

题目数据

  • 整个链表的长度范围为 [1, 100]
  • 每个节点的 val 范围为 [0, 99]
  • 保证整个链表不包含环

示例 1:

输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
输出:Intersected at '8'
解释:相交节点的值为 8 。注意:链表相交点的值不一定等于起始节点的值。

示例 2:

输入:intersectVal = 2, listA = [0,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1
输出:Intersected at '2'
解释:相交节点的值为 2

示例 3:

输入:intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2
输出:null
解释:从各自的表头开始往下移动 `skipA` 和 `skipB` 个节点,会到达两个不相交的节点。因此,两个链表相交。

提示:

  • 假设两个链表相交,相交节点之后的所有节点都相同。
  • 如果你编写的程序尝试访问链表中的最后一个节点后,请确保它不会继续访问链表中的下一个节点,以避免陷入无限循环。

算法实现

算法的核心思路是利用双指针 technique。具体实现步骤如下:

  1. 令指针 p1 指向链表 A 的头结点,指针 p2 指向链表 B 的头结点。
  2. 同时向后移动 p1p2,直到两个指针都指向 null
  3. 如果两个指针都指向 null,则说明两个链表不相交,返回 null
  4. 否则,将 p1 指向链表 A 的头结点,将 p2 指向链表 B 的头结点。
  5. 再次同时向后移动 p1p2,直到两个指针相遇。
  6. 相遇点即为两个链表的交点。

算法复杂度分析

算法的时间复杂度为 O(m + n),其中 mn 分别为链表 AB 的长度。算法的空间复杂度为 O(1),因为不需要额外的空间来存储数据。

结论

本篇博文详细剖析了LeetCode题库中的160题,帮助您深入理解了相交链表算法的实现原理。掌握了这一算法,您不仅能够轻松通过LeetCode的考验,更能提升您解决实际编程问题的技能。欢迎您在评论区留言,与我们分享您的学习心得或提出您的问题,我们一起交流,共同进步。