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.
Credits:
Special thanks to @stellari for adding this problem and creating all test cases.
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if (headA == null || headB == null) return null;
int len1 = 0, len2 = 0;
ListNode tmpA = headA;
while(tmpA != null) {
len1++;
tmpA = tmpA.next;
}
tmpA = headA;
ListNode tmpB = headB;
while(tmpB != null) {
len2++;
tmpB = tmpB.next;
}
tmpB = headB;
if (len1 > len2) {
for (int i = 0; i < len1 - len2; i++) {
tmpA = tmpA.next;
}
}
else if (len1 < len2) {
for (int i = 0; i < len2 - len1; i++) {
tmpB = tmpB.next;
}
}
while(tmpA!= null) {
if (tmpA.equals(tmpB)) return tmpA;
tmpA = tmpA.next;
tmpB = tmpB.next;
}
return tmpA;
}