解答
不难,这里着重纪录一下第二种方法,比较巧
代码一
王道数据结构上有类似题目,双指针同步走
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
int lena=0, lenb=0;
ListNode *pa=headA, *pb=headB;
while(pa != nullptr){
lena++;
pa = pa->next;
}
while(pb != nullptr){
lenb++;
pb = pb->next;
}
pa = headA;
pb = headB;
while(lena > lenb){
pa = pa->next;
lena--;
}
while(lena < lenb){
pb = pb->next;
lenb--;
}
// cout<<lena<<" "<<lenb<<endl;
while(pa != nullptr){
if(pa == pb) break;
pa = pa->next;
pb = pb->next;
}
return pa;
}
};
代码二
思路来源:m-a = n-b, 有m+b = n+a
m多走b , n多走a, 必定会相遇(如果有交叉点)
否则,m多走n, n多走m,最后相遇为nullptr(虚拟交叉点)
思路很巧,自己想不到,记录一下
一般需要循环m+b(或n+a)次,最坏情况为m+n次
在分析一下代码一,需要走m+n+a次,最坏情况为m+n+max(m,n)次
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode* a = headA;
ListNode* b = headB;
while (a != b)
{
a = a != nullptr ? a->next : headB;
b = b != nullptr ? b->next : headA;
}
return a;
}
};