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.
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
if (headA == NULL || headB == NULL) return NULL;
struct ListNode* tmpA = headA;
struct ListNode* tmpB = headB;
int cntA = 1;
int cntB = 1;
while(tmpA->next != NULL) {
cntA++;
tmpA = tmpA->next;
}
while(tmpB->next != NULL) {
cntB++;
tmpB = tmpB->next;
}
if (tmpA != tmpB) return NULL;
tmpA = headA;
tmpB = headB;
while(cntA > 0) {
if (cntA > cntB) {
tmpA = tmpA->next;
cntA--;
}
else if (cntB > cntA) {
tmpB = tmpB->next;
cntB--;
}
else {
while(tmpA != NULL) {
if (tmpA == tmpB) return tmpA;
else {
tmpA = tmpA->next;
tmpB = tmpB->next;
}
}
}
}
return NULL;
}