题目
给你两个单链表的头节点 headA
和 headB
,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null
。
解题思路
对于寻找两个单链表相交的起始节点问题,常用的解决方法是通过双指针法,巧妙地让两个指针同步到相交点。
- 设置两个指针
pA
和pB
分别指向链表headA
和headB
的头节点。 - 同步遍历:
- 如果
pA
到达链表headA
的尾部,则将其指向headB
的头节点; - 如果
pB
到达链表headB
的尾部,则将其指向headA
的头节点。
- 如果
- 两个指针最终会在相交点相遇,或在链表尾部的
null
相遇(无交点)。
通过切换指针的起点,可以保证两个指针走过的路程相等,从而能够在相交点相遇。
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if (headA == null || headB == null) {
return null; // 如果有一个链表为空,则不可能相交
}
ListNode pA = headA;
ListNode pB = headB;
// 两指针同步移动
while (pA != pB) {
pA = (pA == null) ? headB : pA.next; // 如果 pA 到达尾部,则切换到 headB
pB = (pB == null) ? headA : pB.next; // 如果 pB 到达尾部,则切换到 headA
}
// 相交点或者 null
return pA;
}
}
时间复杂度:O(m + n), 两个指针最多遍历链表 headA
和 headB
各一次。
空间复杂度:O(1)。