题目
编写一个程序,找到两个单链表相交的起始节点。
注意:
如果两个链表没有交点,返回 null.
在返回结果后,两个链表仍须保持原有的结构。
可假定整个链表结构中没有循环。
程序尽量满足 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) {
int countA = 0;
int countB = 0;
ListNode *A = headA;
ListNode *B = headB;
while (A != NULL) {
countA++;
A = A->next;
}
while (B != NULL) {
countB++;
B = B->next;
}
A = headA;
B = headB;
if (countA >= countB) {
int temp = countA - countB;
while (temp > 0) {
A = A->next;
temp--;
}
}
if (countB >= countA) {
int temp = countB - countA;
while (temp > 0) {
B = B->next;
temp--;
}
}
while (A != NULL && B != NULL && A != B) {
A = A->next;
B = B->next;
}
return A;
}
};