题目
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。
图示两个链表在节点 c1 开始相交:

题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。
如果两链表是一样长的,那么就可以一个一个指针比过去,直到地址匹配到一样的,就可以返回。
按照这个思路,我们尽量把两表的长度规划到一样的,先把俩链表的size测出来,然后减一减,挪一挪,就可以实现。
cpp
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode* a = headA;
ListNode* b = headB;
int sizeA = 0, sizeB = 0;
int k = 0; //存储差值
while (a != NULL) {
sizeA++;
a = a -> next;
}
while (b != NULL) {
sizeB++;
b = b -> next;
}
a = headA;
b = headB;
if (sizeA > sizeB) {
k = sizeA - sizeB;
for (int p = 0; p < k; p++) {
a = a -> next;
}
}else {
k = sizeB - sizeA;
for (int p = 0; p < k; p++) {
b = b -> next;
}
}
while (a != NULL || b != NULL) {
if (a == b) {
return a;
}else {
a = a -> next;
b = b -> next;
}
}
return NULL;
}
};
在评论里看到了一个比较巧妙解法,就是AB两个指针来回遍历,AB两个链表,这样就刚好有可以在重合的地方相遇。十分之渐变和巧妙。
cpp
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode *A = headA, *B = headB;
while (A != B) {
A = A != nullptr ? A->next : headB;
B = B != nullptr ? B->next : headA;
}
return A;
}
};