52. 两个链表的第一个公共节点
思路:双指针
设第一个公共节点是node,链表headA节点数量是a,链表headB节点数量是b,两链表的公共尾部的节点数量是c,则有:
- 头结点headA到node前,共有a-c个节点;
- 头结点headB到node前,共有b-c个节点;
考虑构建2个头指针A,B分别指向两链表头节点headA,headB,做如下操作:
- 指针A先遍历完headA,再开始遍历链表headB,当走到node时,共走步数:a+b-c
- 指针B先遍历完headB,再开始遍历链表headA,当走到node时,共走步数:b+a-c
此时,有2种情况:
- 若两链表有公共尾部(即c>0): 指针A,B同时指向第一个公共节点node
- 若两链表无公共尾部(即c==0): 指针A,B同时指向null
此时,返回A即可
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode *A=headA,*B=headB;
while(A!=B){
A=A!=nullptr?A->next:headB;
B=B!=nullptr?B->next:headA;
}
return A;
}
};
时间复杂度O(a+b)
空间复杂度 O(1)