public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode *p1=reverseList(headA);
ListNode *p2=reverseList(headB);
ListNode *pre=NULL;
while(p1&&p2)
{
if(p1->val==p2->val)
{
pre=p1;
p1=p1->next;
p2=p2->next;
}
else break;
}
headA=reverseList(p1);
headB=reverseList(p2);
return pre;
}
ListNode* reverseList(ListNode* head) {
if(head==NULL) return head;
if(head->next==NULL) {return head;}
ListNode* p=head;
ListNode* p1;
ListNode* p2;
p1=p->next;
p2=p->next->next;
p->next=NULL;
while(p2)
{
p1->next=p;
p=p1;
p1=p2;
p2=p2->next;
}
p1->next=p;
return p1;
}
};
第一种做法不对,应为c1的next 有两个。所以不能逆置链表。
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if(headA==NULL||headB==NULL) return NULL;
int lenA=0;
int lenB=0;
ListNode *pa,*pb;
while(headA)
{
lenA++;
headA=headA->next;
}
while(headB)
{
lenB++;
headB=headB->next;
}
if(lenA>lenB)
{
pa=headA;
pb=headB;
}
else
{
pa=headB;
pb=headA;
}
int i=abs(lenA-lenB);
while(i>0)
{
pa=pa->next;
i--;
}
while(pa)
{
if(pa!=pb)
{
pa=pa->next;
pb=pb->next;
}
else break;
}
return pa;
}
};