Linkedlist Intersection program in java

Introduction

Linked lists are a fundamental data structure in computer science, known for their simplicity and efficiency in certain scenarios. One intriguing problem involving linked lists is finding or creating intersections between two linked lists. This blog post delves into the concept of linked list intersections, how to implement them in Java, and provides practical insights into their usage.

What is a Linked List Intersection?

An intersection in linked lists occurs when two linked lists share a common node, effectively merging into a single sequence from that point forward. This shared node is often referred to as the intersection point.

Visual Representation

Consider two linked lists that intersect:

List A: 1 -> 2 -> 3 -> 4 -> 6 -> 7

List B: 5 -> 9 -> 0

In the above example, List B intersects List A at node 4. From this intersection point onwards, both lists share the nodes 6 -> 7.

Why Intersections?

Understanding and managing intersections in linked lists can be crucial for various applications:

  • Merging Data: Combining different data streams at a certain point.
  • Detecting Cycles: Identifying loops in linked structures.
  • Optimizing Storage: Reducing redundancy by sharing common sub-lists.

Implementing Linked List Intersection in Java

To demonstrate how to create an intersection between two linked lists in Java, we will write a simple program that constructs two lists and merges them at a specified node. Let’s break down the implementation step-by-step.

Step 1: Define the Node Class

Each node in a linked list contains data and a reference to the next node.

class Node {
int data;
Node next;

Node(int data) {
this.data = data;
this.next = null;
}
}

Step 2: Define the Linked List Class

The linked list class includes methods to insert nodes and display the list contents.

class LList {
Node head;

LList() {
this.head = null;
}

public void insert(int data) {
Node newNode = new Node(data);
if (head == null) {
head = newNode;
} else {
Node current = head;
while (current.next != null) {
current = current.next;
}
current.next = newNode;
}
}

public void display() {
Node current = head;
while (current != null) {
System.out.print(current.data);
if (current.next != null) {
System.out.print("-> ");
}
current = current.next;
}
System.out.println();
}
}

Step 3: Implement the Intersection Method

The intersection method links one list to another at a specified node.

public void intersection(LList list1, int value) {
if (head == null || list1.head == null) {
System.out.println("One of the lists is empty.");
return;
}

Node current = head;
while (current.next != null) {
current = current.next;
}

Node currentList = list1.head;
while (currentList != null && currentList.data != value) {
currentList = currentList.next;
}

if (currentList == null) {
System.out.println("Value " + value + " not found in list1.");
return;
}

current.next = currentList; // Correctly link to the node in list1
}

Step 4: Demonstrate the Intersection

Finally, let’s see the intersection in action with a practical example:

public class Main {
public static void main(String[] args) {
LList list1 = new LList();
list1.insert(1);
list1.insert(2);
list1.insert(3);
list1.insert(4);
list1.insert(6);
list1.insert(7);
list1.display();

LList list2 = new LList();
list2.insert(5);
list2.insert(9);
list2.insert(0);
list2.display();

list2.intersection(list1, 4);
list2.display();
}
}

Full Code

Here’s the complete code in one place:

class Node {
int data;
Node next;

Node(int data) {
this.data = data;
this.next = null;
}
}

class LList {
Node head;

LList() {
this.head = null;
}

public void insert(int data) {
Node newNode = new Node(data);
if (head == null) {
head = newNode;
} else {
Node current = head;
while (current.next != null) {
current = current.next;
}
current.next = newNode;
}
}

public void display() {
Node current = head;
while (current != null) {
System.out.print(current.data);
if (current.next != null) {
System.out.print("-> ");
}
current = current.next;
}
System.out.println();
}

public void intersection(LList list1, int value) {
if (head == null || list1.head == null) {
System.out.println("One of the lists is empty.");
return;
}

Node current = head;
while (current.next != null) {
current = current.next;
}

Node currentList = list1.head;
while (currentList != null && currentList.data != value) {
currentList = currentList.next;
}

if (currentList == null) {
System.out.println("Value " + value + " not found in list1.");
return;
}

current.next = currentList; // Correctly link to the node in list1
}
}

public class Main {
public static void main(String[] args) {
LList list1 = new LList();
list1.insert(1);
list1.insert(2);
list1.insert(3);
list1.insert(4);
list1.insert(6);
list1.insert(7);
list1.display();

LList list2 = new LList();
list2.insert(5);
list2.insert(9);
list2.insert(0);
list2.display();

list2.intersection(list1, 4);
list2.display();
}
}

Conclusion

Intersections in linked lists are a powerful concept that can be used in various applications. By understanding how to create and manage these intersections, you can leverage linked lists more effectively in your programs. This guide has shown how to implement an intersection method in Java and provided a complete working example. Feel free to experiment with different scenarios to see how intersections can optimize and simplify your data structures.

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top