Open In App

Java Program To Merge K Sorted Linked Lists Using Min Heap – Set 2

Given k linked lists each of size n and each list is sorted in non-decreasing order, merge them into a single sorted (non-decreasing order) linked list and print the sorted linked list as output.
Examples: 

Input: k = 3, n =  4
list1 = 1->3->5->7->NULL
list2 = 2->4->6->8->NULL
list3 = 0->9->10->11->NULL

Output: 0->1->2->3->4->5->6->7->8->9->10->11
Merged lists in a sorted order 
where every element is greater 
than the previous element.

Input: k = 3, n =  3
list1 = 1->3->7->NULL
list2 = 2->4->8->NULL
list3 = 9->10->11->NULL

Output: 1->2->3->4->7->8->9->10->11
Merged lists in a sorted order 
where every element is greater 
than the previous element.

Source: Merge K sorted Linked Lists | Method 2



An efficient solution for the problem has been discussed in Method 3 of this post.

Approach: This solution is based on the MIN HEAP approach used to solve the problem ‘merge k sorted arrays’ which is discussed here.
MinHeap: A Min-Heap is a complete binary tree in which the value in each internal node is smaller than or equal to the values in the children of that node. Mapping the elements of a heap into an array is trivial: if a node is stored at index k, then its left child is stored at index 2k + 1 and its right child at index 2k + 2.



  1. Create a min-heap and insert the first element of all the ‘k’ linked lists.
  2. As long as the min-heap is not empty, perform the following steps:
    • Remove the top element of the min-heap (which is the current minimum among all the elements in the min-heap) and add it to the result list.
    • If there exists an element (in the same linked list) next to the element popped out in previous step, insert it into the min-heap.
  3. Return the head node address of the merged list.

Below is the implementation of the above approach:




// Java implementation to merge
// k sorted linked lists
// Using MIN HEAP method
import java.util.PriorityQueue;
import java.util.Comparator;
public class MergeKLists
{
    // Function to merge k sorted
    // linked lists
    public static Node mergeKSortedLists(
                  Node arr[], int k)
    {
        Node head = null, last = null;
 
        // priority_queue 'pq' implemented
        // as min heap with the
        // help of 'compare' function
        PriorityQueue<Node> pq =
                new PriorityQueue<>(new Comparator<Node>()
        {
            public int compare(Node a, Node b)
            {
                return a.data - b.data;
            }
         });
 
        // Push the head nodes of all
        // the k lists in 'pq'
        for (int i = 0; i < k; i++)
            if (arr[i] != null)
                pq.add(arr[i]);
 
        // Loop till 'pq' is not empty
        while (!pq.isEmpty())
        {
            // Get the top element of 'pq'
            Node top = pq.peek();
            pq.remove();
 
            // Check if there is a node
            // next to the 'top' node
            // in the list of which 'top'
            // node is a member
            if (top.next != null)
                // push the next node in 'pq'
                pq.add(top.next);
 
            // if final merged list is empty
            if (head == null)
            {
                head = top;
   
                // Points to the last node so far
                // of the final merged list
                last = top;
            }
            else
            {
                // Insert 'top' at the end of the
                // merged list so far
                last.next = top;
 
                // Update the 'last' pointer
                last = top;
            }
        }
 
        // Head node of the required merged list
        return head;
    }
 
    // Function to print the singly linked list
    public static void printList(Node head)
    {
        while (head != null)
        {
            System.out.print(head.data + " ");
            head = head.next;
        }
    }
 
    // Utility function to create
    // a new node
    public Node push(int data)
    {
        Node newNode = new Node(data);
        newNode.next = null;
        return newNode;
    }
 
    public static void main(String args[])
    {
        // Number of linked lists
        int k = 3;
     
        // Number of elements in each list
        int n = 4;
 
        // An array of pointers storing the
        // head nodes of the linked lists
        Node arr[] = new Node[k];
 
        arr[0] = new Node(1);
        arr[0].next = new Node(3);
        arr[0].next.next = new Node(5);
        arr[0].next.next.next = new Node(7);
 
        arr[1] = new Node(2);
        arr[1].next = new Node(4);
        arr[1].next.next = new Node(6);
        arr[1].next.next.next = new Node(8);
 
        arr[2] = new Node(0);
        arr[2].next = new Node(9);
        arr[2].next.next = new Node(10);
        arr[2].next.next.next = new Node(11);
 
        // Merge all lists
        Node head = mergeKSortedLists(arr, k);
        printList(head);
    }
}
 
class Node
{
    int data;
    Node next;
    Node(int data)
    {
        this.data = data;
        next = null;
    }
}
// This code is contributed by Gaurav Tiwari

Output:

0 1 2 3 4 5 6 7 8 9 10 11 

Complexity Analysis: 

Please refer complete article on Merge k sorted linked lists | Set 2 (Using Min Heap) for more details!


Article Tags :