import java.util.ArrayList;
import java.util.List;
import java.util.PriorityQueue;
public class MergeKSortedList {
public static void main(String[] args) {
// Linked list list to hold all linked list
List<ListNode> lists = new ArrayList<ListNode>();
// create first list
ListNode l1 = new ListNode(1);
l1.next = new ListNode(2);
l1.next.next = new ListNode(3);
l1.next.next.next = new ListNode(4);
l1.next.next.next.next = new ListNode(5);
lists.add(l1);
// second list
ListNode l2 = new ListNode(1);
l2.next = new ListNode(2);
l2.next.next = new ListNode(3);
l2.next.next.next = new ListNode(4);
l2.next.next.next.next = new ListNode(5);
lists.add(l2);
// third list
ListNode l3 = new ListNode(1);
l3.next = new ListNode(5);
l3.next.next = new ListNode(8);
lists.add(l3);
// call for mergeKLists
ListNode merge = mergeKLists(lists);
System.out.println("Merge List is");
linkedListTraversal(merge);
}
// method for merge K list
private static ListNode mergeKLists(List<ListNode> lists) {
if (lists.size() == 0)
return null;
ListNode merge = lists.get(0);
// iterate till end of list
for (int i = 1; i < lists.size(); i++) {
// merge two lists
ListNode next = lists.get(i);
merge = merge(merge, next);
}
return merge;
}
// method for merge two list
private static ListNode merge(ListNode merge, ListNode next) {
// base condition
if (merge == null)
return next;
if (next == null)
return merge;
ListNode tmp1 = merge;
ListNode tmp2 = next;
ListNode root = null;
ListNode tmp = null;
int flag = 0;
while (tmp1 != null && tmp2 != null) {
// first less then
if (tmp1.val < tmp2.val) {
if (flag == 0) {
flag = 1;
root = tmp1;
tmp = root;
} else {
tmp.next = tmp1;
tmp = tmp.next;
}
tmp1 = tmp1.next;
} else {
if (flag == 0) {
flag = 1;
root = tmp2;
tmp = root;
} else {
tmp.next = tmp2;
tmp = tmp.next;
}
if (tmp2 != null)
tmp2 = tmp2.next;
}
}
if (tmp1 != null)
tmp.next = tmp1;
if (tmp2 != null)
tmp.next = tmp2;
return root;
}
// method for traversal list
private static void linkedListTraversal(ListNode node) {
while (node != null) {
System.out.print(node.val + " ");
node = node.next;
}
}
}
class ListNode implements Comparable<ListNode> {
int val;
ListNode next;
ListNode() {
}
ListNode(int val) {
this.val = val;
}
ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
@Override
public int compareTo(ListNode o) {
if (this.val == o.val)
return 0;
else if (this.val > o.val)
return 1;
else
return -1;
}
}