-
Notifications
You must be signed in to change notification settings - Fork 490
/
merge_k_ll.cpp
105 lines (88 loc) Β· 2.49 KB
/
merge_k_ll.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include <iostream>
using namespace std;
class Node {
public:
int data;
Node *next;
Node(int data) {
this->data = data;
next = NULL;
}
};
// function to take input for linked list and return the head pointer to the linked list
Node *takeInput(int n) {
Node *head = NULL, *tail = NULL;
for (int i=0; i<n; i++) {
int data;
cin>>data;
Node *newNode = new Node(data);
if (head == NULL) {
head = newNode;
tail = newNode;
} else {
tail->next = newNode;
tail = tail->next;
}
}
return head;
}
// function to print linked list
void print(Node *head, int n, int k) {
for (int i=0; i<n*k; i++) {
cout<<head->data<<" ";
head = head->next;
}
cout<<endl;
}
Node *merge(Node *list1, Node *list2) {
// base cases
if (list1 == NULL) return list2;
if (list2 == NULL) return list1;
// choose either list1 or list2 and perform recursion
Node *node = list1->data <= list2->data ? list1 : list2;
node->next = list1->data <= list2->data ? merge(list1->next, list2) : merge(list1, list2->next);
return node;
}
Node *merge_k_ll(Node *arr[], int last) {
while (last != 0) { // loop until only one linked lisy is left
int i = 0, j = last;
while (i < j) { // (i, j) forms a pair
arr[i] = merge(arr[i], arr[j]); // merge LinkedList i with LinkedList j and store merged list in LinkedList i
i++; j--; // consider next pair
if (i >= j) last = j; // if all pairs are merged, update last
}
}
return arr[0];
}
int main() {
int n; // number of elements in each linked lists
int k; // number of linked lists
cout<<"Enter the value of n and k: ";
cin>>n>>k;
cout<<"\n";
Node *arr[n]; // array of pointers storing the head nodes of each linked lists
for (int i=0; i<k; i++) {
cout<<"Input linked list No."<< i+1 <<": ";
arr[i] = takeInput(n);
}
Node *head = merge_k_ll(arr, k); // merge all linked lists
cout<<"\nOutput: ";
print(head, n, k); // print sorted linked list
return 0;
}
// Test Case #1
// Input:
// n = 4, k = 3
// LinkedList1 = 1 3 5 7
// LinkedList1 = 2 4 6 8
// LinkedList1 = 0 9 10 11
// Output:
// 0 1 2 3 4 5 6 7 8 9 10 11
// Test Case #2
// Input:
// n = 3, k = 3
// LinkedList1 = 1 3 7
// LinkedList1 = 2 4 8
// LinkedList1 = 9 10 11
// Output:
// 1 2 3 4 7 8 9 10 11