/**
* 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.
*
* Tags: Linkedlist
*/
class IntersectionOfLinkedList {
public static void main(String[] args) {
}
/**
* Time O(n), Space O(1)
* skip all impossible ones
* use recursion to compare next one
*/
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if (headA == null || headB == null) return null;
int lenA = length(headA);
int lenB = length(headB);
int diff = Math.abs(lenA - lenB);
if (lenA > lenB) while(diff-- > 0) headA = headA.next;
else while(diff-- > 0) headB = headB.next;
for (; headA != null && headB != null; headA = headA.next, headB = headB.next) if (headA.equals(headB)) return headA;
return null;
}
private int length(ListNode n) {
if (n == null) return 0;
int length = 0;
while (n != null) {
length++;
n = n.next;
}
return length;
}
public class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
next = null;
}
}
}