# LeetCode 23: Merge k Sorted Lists
#### Use an array to judge if the list is valid (not null) and an integer to count the invalids
```c=
int* valid = (int*)malloc(sizeof(int) * listsSize);
int invalid = 0;
for (int i = 0; i < listsSize; i++) {
if (lists[i] == NULL) {
valid[i] = 0;
invalid++;
} else {
valid[i] = 1;
}
}
```
#### While invalid didn't reach the maximum, pick the smallest value from all the valid list
```c=
int min = 10001; // maximum number for the value
int min_index;
for (int i = 0; i < listsSize; i++) {
if (valid[i]) {
if (lists[i]->val < min) {
min = lists[i]->val;
min_index = i;
}
}
}
```
#### Judge if it's the first one
If yes, connect it to both the head and tail.
If no, connect the tail to the next one.
```c=
if (head == NULL) { // first one
head = lists[min_index];
tail = lists[min_index];
} else { // not the first one
tail->next = lists[min_index];
tail = tail->next;
}
```
#### Judge if the invalids should be added
```c=
if (lists[min_index] == NULL) {
valid[min_index] = 0;
invalid++;
}
```
# Done
::: spoiler Raw Code
```c=
struct ListNode* mergeKLists(struct ListNode** lists, int listsSize) {
struct ListNode* head = NULL;
struct ListNode* tail = NULL;
int* valid = (int*)malloc(sizeof(int) * listsSize);
int invalid = 0;
for (int i = 0; i < listsSize; i++) {
if (lists[i] == NULL) {
valid[i] = 0;
invalid++;
} else {
valid[i] = 1;
}
}
while (invalid != listsSize) {
int min = 10001;
int min_index;
for (int i = 0; i < listsSize; i++) {
if (valid[i]) {
if (lists[i]->val < min) {
min = lists[i]->val;
min_index = i;
}
}
}
if (head == NULL) {
head = lists[min_index];
tail = lists[min_index];
} else {
tail->next = lists[min_index];
tail = tail->next;
}
lists[min_index] = lists[min_index]->next;
if (lists[min_index] == NULL) {
valid[min_index] = 0;
invalid++;
}
}
return head;
}
```
:::