Problem Statement
You are given an array of k linked-lists lists, each linked-list is sorted in ascending order. Merge all the linked-lists into one sorted linked-list and return it. Example 1: Input: lists = [[1,4,5],[1,3,4],[2,6]] Output: [1,1,2,3,4,4,5,6] Explanation: The linked-lists are: [ 1->4->5, 1->3->4, 2->6 ] merging them into one sorted list: 1->1->2->3->4->4->5->6 Example 2: Input: lists = [] Output: [] Example 3: Input: lists = [[]] Output: [] Constraints: k == lists.length 0 <= k <= 104 0 <= lists[i].length <= 500 -104 <= lists[i][j] <= 104 lists[i] is sorted in ascending order. The sum of lists[i].length will not exceed 104.
Java Solution
You can solve this problem using a priority queue (min heap) to efficiently merge the lists. Here’s the Java code for merging k sorted linked lists:
import java.util.Comparator;
import java.util.PriorityQueue;
public class MergeKSortedLists {
public static class ListNode {
int val;
ListNode next;
ListNode(int val) {
this.val = val;
}
}
public ListNode mergeKLists(ListNode[] lists) {
if (lists == null || lists.length == 0) {
return null;
}
// Use a priority queue to keep track of the smallest element at the front
PriorityQueue<ListNode> minHeap = new PriorityQueue<>(Comparator.comparingInt(node -> node.val));
// Add the head of each list to the priority queue
for (ListNode list : lists) {
if (list != null) {
minHeap.offer(list);
}
}
ListNode dummy = new ListNode(0);
ListNode current = dummy;
// Keep popping the smallest element from the priority queue and add its next to the queue
while (!minHeap.isEmpty()) {
ListNode smallest = minHeap.poll();
current.next = smallest;
current = current.next;
if (smallest.next != null) {
minHeap.offer(smallest.next);
}
}
return dummy.next;
}
// Helper method to convert an array of arrays to an array of linked lists
private ListNode[] arraysToLinkedLists(int[][] arrays) {
ListNode[] lists = new ListNode[arrays.length];
for (int i = 0; i < arrays.length; i++) {
lists[i] = arrayToLinkedList(arrays[i]);
}
return lists;
}
// Helper method to convert an array to a linked list
private ListNode arrayToLinkedList(int[] array) {
ListNode dummy = new ListNode(0);
ListNode current = dummy;
for (int value : array) {
current.next = new ListNode(value);
current = current.next;
}
return dummy.next;
}
// Helper method to print a linked list
private void printList(ListNode head) {
while (head != null) {
System.out.print(head.val + " ");
head = head.next;
}
System.out.println();
}
public static void main(String[] args) {
MergeKSortedLists solution = new MergeKSortedLists();
// Example 1
int[][] arrays1 = {{1, 4, 5}, {1, 3, 4}, {2, 6}};
ListNode[] lists1 = solution.arraysToLinkedLists(arrays1);
ListNode mergedList1 = solution.mergeKLists(lists1);
solution.printList(mergedList1);
// Example 2
int[][] arrays2 = {};
ListNode[] lists2 = solution.arraysToLinkedLists(arrays2);
ListNode mergedList2 = solution.mergeKLists(lists2);
solution.printList(mergedList2);
// Example 3
int[][] arrays3 = {{}};
ListNode[] lists3 = solution.arraysToLinkedLists(arrays3);
ListNode mergedList3 = solution.mergeKLists(lists3);
solution.printList(mergedList3);
}
}
This Java code defines a MergeKSortedLists class with a mergeKLists method to merge k sorted linked lists. The ListNode class is used to represent a node in the linked list. The arraysToLinkedLists, arrayToLinkedList, and printList methods are helper methods for data conversion and printing. The main method demonstrates the usage with the provided examples.
Python Solution
Here’s the equivalent Python code for merging k sorted linked lists using a min heap:
import heapq
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def merge_k_lists(lists):
if not lists:
return None
# Use a min heap to keep track of the smallest element at the front
min_heap = []
# Add the head of each list to the min heap
for node in lists:
if node:
heapq.heappush(min_heap, (node.val, node))
dummy = ListNode(0)
current = dummy
# Keep popping the smallest element from the min heap and add its next to the heap
while min_heap:
val, node = heapq.heappop(min_heap)
current.next = node
current = current.next
if node.next:
heapq.heappush(min_heap, (node.next.val, node.next))
return dummy.next
# Helper function to convert an array to a linked list
def array_to_linked_list(array):
dummy = ListNode(0)
current = dummy
for value in array:
current.next = ListNode(value)
current = current.next
return dummy.next
# Helper function to print a linked list
def print_list(head):
while head:
print(head.val, end=" ")
head = head.next
print()
# Example 1
arrays1 = [[1, 4, 5], [1, 3, 4], [2, 6]]
lists1 = [array_to_linked_list(array) for array in arrays1]
merged_list1 = merge_k_lists(lists1)
print_list(merged_list1)
# Example 2
arrays2 = []
lists2 = [array_to_linked_list(array) for array in arrays2]
merged_list2 = merge_k_lists(lists2)
print_list(merged_list2)
# Example 3
arrays3 = [[]]
lists3 = [array_to_linked_list(array) for array in arrays3]
merged_list3 = merge_k_lists(lists3)
print_list(merged_list3)
This Python code uses the heapq module to implement a min heap for efficiently merging k sorted linked lists. The merge_k_lists function takes a list of linked lists as input and returns the merged sorted linked list. The ListNode class is used to represent a node in the linked list. The array_to_linked_list, print_list, and examples demonstrate the usage of the function with the provided test cases.
