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.
时间复杂度O(N+M),空间复杂度O(1):
第一遍遍历两个列表,得到列表headA和headB的元素个数N,M,假设N>M。
然后headA从第N-M个元素开始遍历,headB从第一个元素开始遍历,遇到相等的元素返回。如果遍历到末尾都不相等,返回NULL。
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
if(headA == NULL || headB == NULL)
return NULL;
int m = 0, n = 0;
struct ListNode *tailA = headA, *tailB = headB;
while(tailA != NULL){
m++;
tailA = tailA -> next;
}
while(tailB != NULL){
n++;
tailB = tailB -> next;
}
if(m < n){
int temp = m;
m = n;
n = temp;
tailA = headB;
tailB = headA;
}else{
tailA = headA;
tailB = headB;
}
int i = m - n;
while(i > 0){
tailA = tailA -> next;
i--;
}
while(tailA != NULL){
if(tailA == tailB)
return tailA;
tailA = tailA -> next;
tailB = tailB -> next;
}
return NULL;
}