先算出两个链表的长度,让长的那个先走长度差的距离,再进行比较。
本想先判断一下结尾,如果结尾不同那就肯定不同,但是速度变慢了,不知道哪里写的不好,就先不加了。
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
int i = 0;
int j = 0;
ListNode *tmp1 = headA;
ListNode *tmp2 = headB;
while(headA){
i++;
headA = headA->next;
}
while(headB){
j++;
headB = headB->next;
}
bool flag = true;
int cha = 0;
if(i>j){
cha = i-j;
}else{
cha = j-i;
flag = false;
}
while(cha--){
if(flag){
tmp1 = tmp1->next;
}else{
tmp2 = tmp2->next;
}
}
while(tmp1){
if(tmp1==tmp2) return tmp1;
else{
tmp1 = tmp1->next;
tmp2 = tmp2->next;
}
}
return NULL;
}
后来发现了神一样的做法,第二轮循环两个节点必然位置相同。
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB)
{
ListNode *p1 = headA;
ListNode *p2 = headB;
if (p1 == NULL || p2 == NULL) return NULL;
while (p1 != NULL && p2 != NULL && p1 != p2) {
p1 = p1->next;
p2 = p2->next;
if (p1 == p2) return p1;
if (p1 == NULL) p1 = headB;
if (p2 == NULL) p2 = headA;
}
return p1;
}