返回
直击LeetCode 160:巧解相交链表,剖析经典算法
前端
2023-09-02 05:05:52
[LeetCode 160] 相交链表
题干
给你两个单链表的头节点 headA
和 headB
,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 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。具体实现步骤如下:
- 令指针
p1
指向链表A
的头结点,指针p2
指向链表B
的头结点。 - 同时向后移动
p1
和p2
,直到两个指针都指向null
。 - 如果两个指针都指向
null
,则说明两个链表不相交,返回null
。 - 否则,将
p1
指向链表A
的头结点,将p2
指向链表B
的头结点。 - 再次同时向后移动
p1
和p2
,直到两个指针相遇。 - 相遇点即为两个链表的交点。
算法复杂度分析
算法的时间复杂度为 O(m + n)
,其中 m
和 n
分别为链表 A
和 B
的长度。算法的空间复杂度为 O(1)
,因为不需要额外的空间来存储数据。
结论
本篇博文详细剖析了LeetCode题库中的160题,帮助您深入理解了相交链表算法的实现原理。掌握了这一算法,您不仅能够轻松通过LeetCode的考验,更能提升您解决实际编程问题的技能。欢迎您在评论区留言,与我们分享您的学习心得或提出您的问题,我们一起交流,共同进步。