思路:将两个链表右端对齐,分别计算长度,然后长度相减得到gap,让长的那个往前走gap次,这样就保证他们不仅右端对齐,还从同一起点出发。这样每走一次,就判断,如果结点相同就返回。走完了还没找到,说明没有相交的结点,返回null。
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if (headA == nullptr || headB == nullptr)
return nullptr;
int a = 0, b = 0;
ListNode *p = headA, *q = headB;
while (p != nullptr) {
p = p->next;
a++;
}
while (q != nullptr) {
q = q->next;
b++;
}
p = headA, q = headB;
int diff = abs(a - b);
if (a > b) {
while (diff--) {
p = p->next;
}
} else {
while (diff--) {
q = q->next;
}
}
while (p != nullptr && q!= nullptr) { //这里不能写成p.next != NUll,因为如果只有一个结点的话并且他们指向的结点都相同,那么他们是相交的。但是写成p.next != NUll,会直接跳过while循环,也就是少了一次判断。会错误的判断为没有相交的结点
if (p == q) {
return p;
}
p = p->next;
q = q->next;
}
return nullptr;
}