LeetCode 160:相交链表
题目描述
给定两个单链表的头节点 headA 和 headB,找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 nullptr。
提高要求:时间复杂度为 O(m + n),空间复杂度为 O(1),其中 m 和 n 分别为两个链表的长度。

思路分析
暴力解法
最直观的思路是两层循环:遍历链表 A 和链表 B,将链表 A 中的每个结点的地址都和链表 B 中的每个结点进行比较。如果地址相等,则说明找到了相交点。
具体操作如下:
- 使用两个指针
curNode1和curNode2分别迭代遍历两个链表。 - 外层循环移动
curNode1,内层循环中curNode2从头开始遍历。 - 当
curNode1 == curNode2时,代表是相交的结点,直接返回当前结点。 - 若内层循环结束仍未找到,
curNode1向后移动,curNode2重置回headB。 - 循环结束后若未返回,说明无交点,返回
nullptr。
该方案时间复杂度为 O(n^2),空间复杂度为 O(1)。虽然满足空间要求,但在链表较长时效率较低。
while(curNode1){
while(curNode2){
if(curNode1 == curNode2) return curNode1;
else curNode2 = curNode2->next;
}
curNode1 = curNode1->next;
curNode2 = headB;
}
return nullptr;
快慢指针(长度差法)
为了优化时间复杂度,我们可以利用链表长度的特性。核心思想是让两个指针在剩余长度相同的情况下同时移动,这样它们到达交点的步数就一致了。


