- Given two single linked lists, find out the intersection point of two single linked lists.
- Traverse the single linked lists using non recursive or iterative algorithm.
- Suppose, we have two linked lists and they meets at certain point
- then, we would like to find out the meeting or join point.
- We have shown two single linked lists, Linked list 1 and linked list 2 in Fig 1.
- Both linked lists are intersected at node 50.
- As per our problem statement, we are interested in Node 50, where two linked lists intersects or joins together.
- Let us analyze the single linked lists shown in Fig 1
- Both single linked lists are joined together at node 50
- All the nodes after node 50 are common in both linked list (shown in green color).
- The nodes prior to node 50 differ in both the list i.e. length (or/and data) of lists varies prior to node 50.
- If we can able to find out the difference in length, prior to node 50, then we can figure out the join point of linked lists.
Algorithm – find intersection or join point of two single linked lists in java
- Find out the length of single linked list1 & list2
- length of single linked list1 as shown in Fig 1 is 9
- length of linked single linked list2 is 7
- Find out the differences of length of two linked lists
- difference = length of larger list – length of smaller list
- difference = 9 – 7 => 2
- So, we can reduce two nodes from larger linked list (i.e. Linked list 1)
- then Linked list 1 will become equal to Linked list 2
- Move the head pointer of larger list by 2
- We have shown head1 reference shift by 2 in Fig 2
- Now, both head1 (pointing at Node 30) and head2 will travel equal nodes
- i.e Both linked lists will travel 7 nodes
- Compare the address of both nodes during traversal
- Address will be same at Node 50
- So, Node 50 will be join point
- Got the join points of both linked lists
Time complexity of algorithm is O (n).
Program – find intersection or join point of two single linked lists in java
1.) IntersectionPoint Class:
- We are passing head of both single linked lists
- We are finding the join point by calling intersectionPoint method.
package org.learn.Question; import org.learn.List.Node; public class IntersectionPoint { public static Node intersectionPoint(Node head1, Node head2) { int length1 = length(head1); int length2 = length(head2); Node largerList = null; Node smallerList = null; if (length1 > length2) { largerList = head1; smallerList = head2; } else { largerList = head2; smallerList = head1; } return getIntersetPoint(largerList, smallerList, Math.abs(length1 - length2)); } private static Node getIntersetPoint(Node largerList,Node smallerList,int lengthDifference) { int count = 0; while (count++ < lengthDifference) { largerList = largerList.next; } while (largerList != null && smallerList != null) { if (largerList == smallerList) return largerList; largerList = largerList.next; smallerList = smallerList.next; } return null; } public static int length(Node head) { int length = 0; while (head != null) { head = head.next; length++; } return length; } public static Node insert(Node head, int data) { while (head.next != null) head = head.next; head.next = new Node(data); return head.next; } public static void print(Node head) { while (head != null) { System.out.printf("%d ", head.data); head = head.next; } System.out.println(""); } }
2.) App Class:
- We are creating two single linked lists (head1 and head2) in main method.
- We will print single linked lists.
- Finding the join points of Y shaped linked lists
package org.learn.Client; import org.learn.List.Node; import org.learn.Question.IntersectionPoint; public class App { public static void main(String[] args) { // List 1 - 20 25 30 35 40 int[] data1 = { 20, 25, 30, 35, 40 }; Node head1 = new Node(data1[0]); Node lastNodeList1 = null; for (int count = 1; count < data1.length; count++) { lastNodeList1 = IntersectionPoint.insert(head1, data1[count]); } // List 2 - 3 6 9 int[] data2 = { 3, 6, 9 }; Node head2 = new Node(data2[0]); Node lastNodeList2 = null; for (int count = 1; count < data2.length; count++) { lastNodeList2 = IntersectionPoint.insert(head2, data2[count]); } // Common Nodes - 50 51 52 53 int[] commonData = { 50, 51, 52, 53 }; Node commonList = new Node(commonData[0]); for (int count = 1; count < commonData.length; count++) { IntersectionPoint.insert(commonList, commonData[count]); } // 20 25 30 35 40 50 51 52 53 lastNodeList1.next = commonList; // 3 6 9 50 51 52 53 lastNodeList2.next = commonList; System.out.println("1.) Single linked list 1 is :"); IntersectionPoint.print(head1); System.out.println("2.) Single linked list 2 is :"); IntersectionPoint.print(head2); Node intersectNode = IntersectionPoint.intersectionPoint(head1, head2); if (null != intersectNode) { System.out.printf("3.) Single linked lists-intersected at: %d", intersectNode.data); } else { System.out.println("3.) Single linked lists are not intersected"); } } }
3.) Node Class:
- Node class representing the node (s) of single linked lists.
package org.learn.List; public class Node { public int data; public Node next; public Node(int num) { this.data = num; this.next = null; } }
Output – intersection or join points of two single linked lists in java
1.) Single linked list 1 is : 20 25 30 35 40 50 51 52 53 2.) Single linked list 2 is : 3 6 9 50 51 52 53 3.) Single linked lists are intersected at: 50
Download Code – Intersection / join point of two single linked lists