思路一:
- 遍历 A 和 B 两个单链表并分别计算出其长度,分别记为 lena 和 lenb;
- 设置指针 a 和 b,指针指向由 lena 和 lenb 的大小关系决定:
- 如果 lena = lenb,则 a 和 b 分别指向 A 和 B 的第一个结点;
- 如果 lena > lenb,则 a 指向 A 的第 (lena - lenb + 1) 个结点,b 指向 B 的第一个结点;
- 若果 lena < lenb,则 a 指向 A 中第一个结点,b 指向 B 的第 (lenb - lena + 1)个结点;
- 指针 a 和 b 同时向后遍历链表,直到两者指向同一节点或者均为NULL为止。
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode *a = headA, *b = headB;
int lena, lenb;
lena = lenb = 0;
while(a != NULL) {
lena++;
a = a -> next;
}
while(b != NULL) {
lenb++;
b = b -> next;
}
a = headA;
b = headB;
if(lena < lenb) {
for(int i = 0; i < (lenb - lena); i++)
b = b -> next;
} else if(lena > lenb) {
for(int i = 0; i < (lena - lenb); i++)
a = a -> next;
}
while(a != NULL && a != b) {
a = a -> next;
b = b -> next;
}
if(a == NULL) return NULL;
else return a;
}
};
思路二:
在逻辑上将单链表B连接在单链表A的后面,同理,逻辑上将单链表A连接在单链表B的后面,如图所示:
指针 a 和 b 均分别从 A 和 B 的第一个结点开始遍历,直到两个指针指向同一个结点或者都为NULL为止。
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if(!headA || !headB) return NULL;
ListNode *a = headA, *b = headB;
while(a != b) {
a = (a == NULL) ? headB : a -> next;
b = (b == NULL) ? headA : b -> next;
}
if(a == NULL) return NULL;
else return a;
}
};