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.
Solution 1
Make the liked list into a circle and then break it, for more detail check Crack the coding interview
3ms 9.71%
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if(headA == null || headB == null){
return null;
}
ListNode node = headA;
while(node.next != null){
node = node.next;
}
node.next = headB;
ListNode result = find(headA);
node.next = null;
return result;
}
private ListNode find(ListNode head){
ListNode slow, fast;
slow = head;
fast = head;
while(fast != null && fast.next != null){
slow = slow.next;
fast = fast.next.next;
if(slow == fast){
break;
}
}
if(fast == null || fast.next == null){
return null;
}
slow = head;
while(slow != fast){
slow = slow.next;
fast = fast.next;
}
return slow;
}
}
Solution2 Make sure that we start at the point that is the same length far from the end.
3ms 9.71%
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if(headA == null || headB == null){
return null;
}
int lena = length(headA);
int lenb = length(headB);
int max = Math.max(lena, lenb);
int diff = Math.abs(lena - lenb);
if(lena > lenb){
headA = move(headA, diff);
}else{
headB = move(headB, diff);
}
while(headA != null && headB != null){
if(headA == headB){
return headA;
}
headA = headA.next;
headB = headB.next;
}
return null;
}
public ListNode move(ListNode head, int steps){
int i = 0;
while(i < steps){
head = head.next;
i++;
}
return head;
}
public int length(ListNode node){
int l = 0;
while(node != null){
l ++;
node = node.next;
}
return l;
}
}
Solution3 Another way to find the same start
2ms 30.34%
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if(headA == null || headB == null){
return null;
}
ListNode node1 = headA;
ListNode node2 = headB;
while(node1!= null && node2 != null){
node1 = node1.next;
node2 = node2.next;
}
if(node1 == null){
node1 = headB;
while(node1!= null && node2 != null){
node1 = node1.next;
node2 = node2.next;
}
node2 = headA;
while(node1 != node2 && node1 != null && node2 != null){
node1 = node1.next;
node2 = node2.next;
}
}else{
node2 = headA;
while(node1!= null && node2 != null){
node1 = node1.next;
node2 = node2.next;
}
node1 = headB;
while(node1 != node2 && node1 != null && node2 != null){
node1 = node1.next;
node2 = node2.next;
}
}
if(node1 == null || node2 == null){
return null;
}
return node1;
}
}