要求:找第一个相交节点,时间O(n)空间O(1)
思路:利用走的步数差
/**
* 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 *p1=headA,*p2=headB;
int skipa=0,skipb=0;
while(p1->next!=nullptr){
p1=p1->next;
++skipa;
}
while(p2->next!=nullptr){
p2=p2->next;
++skipb;
}
if(p1!=p1)return nullptr;
if(skipa>=skipb){
int move=skipa-skipb;
p1=headA;
while(move--)p1=p1->next;
p2=headB;
}
else if(skipb>skipa){
int move=skipb-skipa;
p2=headB;
while(move--)p2=p2->next;
p1=headA;
}
while(p1!=p2){
p1=p1->next;
p2=p2->next;
}
return p1;
}
};