Find intersection point of two Linked Lists without finding the length
Last Updated :
10 Apr, 2023
There are two singly linked lists in a system. By some programming error, the end node of one of the linked lists got linked to the second list, forming an inverted Y shaped list. Write a program to get the point where both the linked lists merge.
Examples:
Input: 1 -> 2 -> 3 -> 4 -> 5 -> 6
^
|
7 -> 8 -> 9
Output: 4
Input: 13 -> 14 -> 5 -> 6
^
|
10 -> 2 -> 3 -> 4
Output: 14
Prerequisites: Write a function to get the intersection point of two Linked Lists
Approach: Take two pointers for the heads of both the linked lists. If one of them reaches the end earlier then use it by moving it to the beginning of the other list. Once both of them go through reassigning they will be equidistance from the collision point.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
class Node {
public :
int data;
Node* next;
};
int getIntesectionNode(Node* head1, Node* head2)
{
Node* current1 = head1;
Node* current2 = head2;
if (!current1 or !current2)
return -1;
while (current1 and current2
and current1 != current2) {
current1 = current1->next;
current2 = current2->next;
if (current1 == current2)
return current1->data;
if (!current1)
current1 = head2;
if (!current2)
current2 = head1;
}
return current1->data;
}
int main()
{
Node* newNode;
Node* head1 = new Node();
head1->data = 10;
Node* head2 = new Node();
head2->data = 3;
newNode = new Node();
newNode->data = 6;
head2->next = newNode;
newNode = new Node();
newNode->data = 9;
head2->next->next = newNode;
newNode = new Node();
newNode->data = 15;
head1->next = newNode;
head2->next->next->next = newNode;
newNode = new Node();
newNode->data = 30;
head1->next->next = newNode;
head1->next->next->next = NULL;
cout << getIntesectionNode(head1, head2);
return 0;
}
|
Java
class GFG
{
static class Node
{
int data;
Node next;
};
static int getIntesectionNode(Node head1, Node head2)
{
Node current1 = head1;
Node current2 = head2;
if (current1 == null || current2 == null )
return - 1 ;
while (current1 != null && current2 != null
&& current1 != current2)
{
current1 = current1.next;
current2 = current2.next;
if (current1 == current2)
return current1.data;
if (current1 == null )
current1 = head2;
if (current2 == null )
current2 = head1;
}
return current1.data;
}
public static void main(String[] args)
{
Node newNode;
Node head1 = new Node();
head1.data = 10 ;
Node head2 = new Node();
head2.data = 3 ;
newNode = new Node();
newNode.data = 6 ;
head2.next = newNode;
newNode = new Node();
newNode.data = 9 ;
head2.next.next = newNode;
newNode = new Node();
newNode.data = 15 ;
head1.next = newNode;
head2.next.next.next = newNode;
newNode = new Node();
newNode.data = 30 ;
head1.next.next = newNode;
head1.next.next.next = null ;
System.out.print(getIntesectionNode(head1, head2));
}
}
|
Python3
class new_Node:
def __init__( self , data):
self .data = data
self . next = None
def getIntesectionNode(head1, head2):
current1 = head1
current2 = head2
if ( not current1 or not current2 ):
return - 1
while (current1 and current2 and current1 ! = current2):
current1 = current1. next
current2 = current2. next
if (current1 = = current2):
return current1.data
if ( not current1):
current1 = head2
if ( not current2):
current2 = head1
return current1.data
head1 = new_Node( 10 )
head2 = new_Node( 3 )
newNode = new_Node( 6 )
head2. next = newNode
newNode = new_Node( 9 )
head2. next . next = newNode
newNode = new_Node( 15 )
head1. next = newNode
head2. next . next . next = newNode
newNode = new_Node( 30 )
head1. next . next = newNode
head1. next . next . next = None
print (getIntesectionNode(head1, head2))
|
C#
using System;
class GFG
{
class Node
{
public int data;
public Node next;
};
static int getIntesectionNode(Node head1, Node head2)
{
Node current1 = head1;
Node current2 = head2;
if (current1 == null || current2 == null )
return -1;
while (current1 != null && current2 != null
&& current1 != current2)
{
current1 = current1.next;
current2 = current2.next;
if (current1 == current2)
return current1.data;
if (current1 == null )
current1 = head2;
if (current2 == null )
current2 = head1;
}
return current1.data;
}
public static void Main(String[] args)
{
Node newNode;
Node head1 = new Node();
head1.data = 10;
Node head2 = new Node();
head2.data = 3;
newNode = new Node();
newNode.data = 6;
head2.next = newNode;
newNode = new Node();
newNode.data = 9;
head2.next.next = newNode;
newNode = new Node();
newNode.data = 15;
head1.next = newNode;
head2.next.next.next = newNode;
newNode = new Node();
newNode.data = 30;
head1.next.next = newNode;
head1.next.next.next = null ;
Console.Write(getIntesectionNode(head1, head2));
}
}
|
Javascript
<script>
class Node {
constructor()
{
this .data = 0;
this .next = null ;
}
};
function getIntesectionNode(head1, head2)
{
var current1 = head1;
var current2 = head2;
if (!current1 || !current2)
return -1;
while (current1 && current2
&& current1 != current2) {
current1 = current1.next;
current2 = current2.next;
if (current1 == current2)
return current1.data;
if (!current1)
current1 = head2;
if (!current2)
current2 = head1;
}
return current1.data;
}
var newNode;
var head1 = new Node();
head1.data = 10;
var head2 = new Node();
head2.data = 3;
newNode = new Node();
newNode.data = 6;
head2.next = newNode;
newNode = new Node();
newNode.data = 9;
head2.next.next = newNode;
newNode = new Node();
newNode.data = 15;
head1.next = newNode;
head2.next.next.next = newNode;
newNode = new Node();
newNode.data = 30;
head1.next.next = newNode;
head1.next.next.next = null ;
document.write( getIntesectionNode(head1, head2));
</script>
|
Time complexity O(m+n),where m and n are the lengths of the two linked lists
Space complexity O(1),as it uses a constant amount of additional memory to store only a few pointers to nodes.
Share your thoughts in the comments
Please Login to comment...