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.
Subscribe to see which companies asked this question
Tags
Linked List
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Solution:
- Get the length of each linked lists
- Calc the diff and move the longer one ahead diff steps
- Compare the two
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} headA
* @param {ListNode} headB
* @return {ListNode}
*/
var getIntersectionNode = function(headA, headB) {
var lena = 0, lenb = 0;
// get the length of A and B
var nodea = headA, nodeb = headB;
while(nodea) {
nodea = nodea.next;
lena++;
}
while(nodeb) {
nodeb = nodeb.next;
lenb++;
}
// get the diff
if(lena > lenb) {
var diff = lena -lenb;
nodea = headA;
nodeb = headB;
while(diff > 0) {
nodea = nodea.next;
diff--;
}
} else {
diff = lenb -lena;
nodea = headA;
nodeb = headB;
while(diff > 0) {
nodeb = nodeb.next;
diff--;
}
}
// starting from nodea and nodeb
// compare the reference, not the value
while(nodea !== nodeb) {
nodea = nodea.next;
nodeb = nodeb.next;
}
return nodea;
};