160. Intersection of Two Linked Lists
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.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if(headA == null || headB == null) return null;
int a = 0;
int b = 0;
ListNode ha = headA;
ListNode hb = headB;
while(ha != null || hb != null){
if(ha != null){
ha = ha.next;
a++;
}
if(hb != null){
hb = hb.next;
b++;
}
}
int delta = b - a;
ha = headA;
hb = headB;
if(delta > 0){
while(delta-- > 0){
hb = hb.next;
}
}else if(delta < 0){
while(delta++ <0){
ha = ha.next;
}
}
// ping ha and hb to the right pos in the list, so that both has k distance to the end.
while(ha != null){
if(ha == hb) return ha;
ha = ha.next;
hb = hb.next;
}
return null;
}
}