1. 问题描述与理解
LeetCode 160题"相交链表"是一个经典的链表操作问题,要求我们找到两个单链表相交的起始节点。这个问题看似简单,却蕴含着链表操作的精妙技巧。
问题定义:给定两个单链表的头节点headA和headB,找出并返回它们相交的起始节点。如果两个链表没有交点,则返回null。
关键概念:
- 链表相交指的是从某个节点开始,两个链表共享相同的节点(内存地址相同)
- 相交节点的值可能相同也可能不同,判断依据是节点引用而非节点值
- 题目保证链表在整个链式结构中不存在环
示例说明:
code复制链表A: 4 -> 1 -> 8 -> 4 -> 5
链表B: 5 -> 6 -> 1 -> 8 -> 4 -> 5
这两个链表在值为8的节点处相交,因为从该节点开始,后续节点完全相同(内存地址相同)。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础解法分析
2.1 暴力枚举法
这是最直观的解法,但效率最低。基本思路是对于链表A中的每个节点,遍历链表B的所有节点进行比较。
实现步骤:
- 初始化指针currA指向headA
- 对于currA指向的每个节点:
a. 初始化指针currB指向headB
b. 遍历链表B,比较currA和currB是否指向同一节点
c. 如果找到相同节点,立即返回 - 如果遍历结束未找到,返回null
时间复杂度分析:
- 最坏情况下需要遍历链表A的所有m个节点,对于每个节点遍历链表B的所有n个节点
- 时间复杂度为O(m×n)
空间复杂度:O(1),仅使用常数级别的额外空间
适用场景:
- 仅适用于非常短的链表
- 面试中可以作为思考起点,但需要优化
2.2 哈希表法
利用哈希集合存储已访问节点,空间换时间的典型解法。
实现步骤:
- 创建哈希集合visited
- 遍历链表A,将所有节点加入visited
- 遍历链表B,检查每个节点是否存在于visited中
- 找到第一个存在的节点即为交点
- 如果遍历结束未找到,返回null
时间复杂度分析:
- 遍历链表A和链表B各一次
- 哈希表插入和查询操作平均时间复杂度为O(1)
- 总体时间复杂度为O(m+n)
空间复杂度:O(m)或O(
