---
# System prepended metadata

title: 'LeetCode #23 [Merge k Sorted Lists](https://leetcode.com/problems/merge-k-sorted-lists/)'
tags: [LeetCode, Linked List, Hard, Merge Sort]

---

###### tags: `LeetCode` `Linked List` `Merge Sort` `Hard`
# LeetCode #23 [Merge k Sorted Lists](https://leetcode.com/problems/merge-k-sorted-lists/)
### (Hard)

給你一個鏈結串列數組，每個鏈結串列都已經按升序排列。

請你將所有鏈結串列合併到一個升序鏈結串列中，返回合併後的鏈結串列。

---

一次處理兩個鏈結串列的merge sort, 並將處理完的鏈結串列存入鏈結串列數組中, 再刪掉處理過的鏈結串列(數組中的前兩個), 直到整個數組只剩下一個鏈結串列時, 返回該鏈結串列即可。

---
```
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        if(!lists.size())return nullptr;
        while(lists.size()>1){
            lists.push_back(mergeTwo(lists[0], lists[1]));
            lists.erase(lists.begin());
            lists.erase(lists.begin());
        }
        return lists.front();
    }
    ListNode* mergeTwo(ListNode* l1, ListNode* l2){
        if(!l1)return l2;
        else if(!l2)return l1;
        else if(l1->val<=l2->val){
            l1->next = mergeTwo(l1->next, l2);
            return l1;
        }
        else{
            l2->next = mergeTwo(l1, l2->next);
            return l2;
        }
    }
};
```