23. Merge k Sorted Lists

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.

Example:

Input:
[
  1->4->5,
  1->3->4,
  2->6
]
Output: 1->1->2->3->4->4->5->6

AC code:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        if (lists.size() == 0) {
            return nullptr;
        }
        while (lists.size() > 1) {
            lists.push_back(mergeTowLists(lists[0], lists[1]));
            lists.erase(lists.begin());
            lists.erase(lists.begin());
        }
        return lists.front();
    }
    
    ListNode* mergeTowLists(ListNode* first, ListNode* second) {
        if (first == nullptr) {
            return second;
        } 
        if (second == nullptr) {
            return first;
        }
        // 这个地方first是一个指向链表的指针所以用->而不用.
        if (first->val <= second->val) {
            // 这里的递归调用,当满足条件的时候mergeTowLists()可以先不用管,最后递归出来的时候会将满足条件的链表返回
            // 可以先从递归的最后一个条件考虑
            first->next = mergeTowLists(first->next, second);
            return first;
        } else {
            second->next = mergeTowLists(first, second->next);
            return second;
        }
    }
};

Runtime: 56 ms, faster than 26.25% of C++ online submissions for Merge k Sorted Lists.

                  递归的最后一个:

return:                      ->  6

return:                 ->   5    ->   6

                 4   ->   5    ->   6

            . . . . .

return  1  ->  1  ->  2  ->  3  ->  4  ->   4   ->   5 ->   6

永远渴望,大智若愚(stay hungry, stay foolish)
原文地址:https://www.cnblogs.com/h-hkai/p/9745892.html