Write a program to find the node at which the intersection of two singly linked lists begins.
For example, the following two linked lists:
A: a1 → a2 ↘ c1 → c2 → c3 ↗ B: b1 → b2 → b3
begin to intersect at node c1.
Notes:
- If the two linked lists have no intersection at all, return
null
. - The linked lists must retain their original structure after the function returns.
- You may assume there are no cycles anywhere in the entire linked structure.
- Your code should preferably run in O(n) time and use only O(1) memory.
先要注意时间和空间要求,所以穷举法和hash法就不行了。我们可以利用他们的长度做文章,如果A和B长度相同,两个指针只需要同步从前往后比较就行了。如果长度不同,让指针移位到长度相同的地方,代码如下:
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
auto A=headA;
auto B=headB;
if(headA==NULL||headB==NULL) return NULL;
int lengthA=0;
while(A!=NULL){A=A->next;lengthA++;}
int lengthB=0;
while(B!=NULL){B=B->next;lengthB++;}
A=headA;B=headB;
if(lengthA<lengthB){
int n=lengthB-lengthA;
while(n!=0){B=B->next;n--;}
}
else if(lengthA>lengthB){
int n=lengthA-lengthB;
while(n!=0){A=A->next;n--;}
}
while(A!=NULL){
if(A==B) return A;
A=A->next;B=B->next;
}
return A;
}
};