// 1215
// intersection of two linked list
// easy solution
// starting time
// PM 11:10
// idea - to start at two points simultaneously
// 1. check lengths
// 2. in the short branch, start late
// end time
// PM 11:28
// duration: 18 minutes
#include<stdio.h>
// 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) {
// check each length
int cnt1 = 0;
int cnt2 = 0;
ListNode *ptrA = headA;
while(ptrA!=nullptr)
{
ptrA = ptrA->next;
cnt1++;
}
ListNode *ptrB = headB;
while(ptrB!=nullptr)
{
ptrB = ptrB->next;
cnt2++;
}
ptrA = headA;
ptrB = headB;
printf("%d\n", cnt1);
printf("%d\n", cnt2);
if(cnt1 > cnt2)
{
int diff = cnt1 - cnt2;
for(int i=0; i<diff; ++i)
{
ptrA = ptrA->next;
}
for(int i=0; i<cnt2; ++i)
{
if(ptrA == ptrB)
{
return ptrA;
}
ptrA = ptrA->next;
ptrB = ptrB->next;
}
}else if(cnt1 < cnt2)
{
int diff = cnt2 - cnt1;
for(int i=0; i<diff; ++i)
{
ptrB = ptrB->next;
}
for(int i=0; i<cnt1; ++i)
{
printf("A: %d\n", ptrA->val);
printf("B: %d\n", ptrB->val);
if(ptrA == ptrB)
{
return ptrA;
}
ptrA = ptrA->next;
ptrB = ptrB->next;
}
}else
{
for(int i=0; i<cnt1; ++i)
{
if(ptrA == ptrB)
{
return ptrA;
}
ptrA = ptrA->next;
ptrB = ptrB->next;
}
}
return nullptr;
}
};