方一:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
//相交问题=>就用双指针
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if(headA==nullptr||headB==nullptr)return nullptr;
ListNode *pa = headA , *pb = headB;
while(pa!=pb){
pa = (pa ==nullptr ? headB :pa->next);
pb = (pb ==nullptr ? headA :pb->next);
}
return pa;
}
};
方二
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if(headA==nullptr||headB==nullptr)return nullptr;
ListNode *pa = headA , *pb = headB;
int counta=0,countb=0;//分别计算A,B两条链子的长度
while(pa!=nullptr){
counta++;
pa=pa->next;
}
while(pb!=nullptr){
countb++;
pb=pb->next;
}
int cha;//counta与countb的差值的绝对值
if(counta<countb){//b长,就让b先走多的步数
cha=countb-counta;
pa=headA;
pb=headB;
while(cha!=0){
pb=pb->next;
cha--;
}
}else{//a长,就让a先走多的步数
cha=counta-countb;
pa=headA;
pb=headB;
while(cha!=0){
pa=pa->next;
cha--;
}
}
while(pa!=pb){//一起走,直到最终相遇,像极了爱情
pa = pa->next;
pb = pb->next;
}
return pa;
}
};