LeetCode23 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
题源:here;完整代码:here
思路:
在LeetCode上的解答中(here)一共给出了五种不同的解法。我选择了其中较容易实现并且复杂度较低的一种:合并法。顾名思义,就是将输入的序列两两合并,其合并的结果又两两合并,直到只有一个为止,如下图所示(引用自:here)。
这里写图片描述
代码

    ListNode * merge2(ListNode *l1, ListNode *l2){
        ListNode result(0), *curr;
        curr = &result;
        while (l1 && l2){
            if (l1->val < l2->val){
                curr->next = l1;
                curr = curr->next;
                l1 = l1->next;
            }
            else{
                curr->next = l2;
                curr = curr->next;
                l2 = l2->next;
            }
        }

        curr->next = l1 ? l1 : l2;

        return result.next;
    }

    ListNode* mergeKLists(vector<ListNode*>& lists) {   
        if (lists.size() == 0) return NULL;
        while (lists.size() > 1){
            vector<ListNode*> temp_lists;
            for (int i = 0; i < lists.size() / 2; i++){
                ListNode* temp = merge2(lists[2*i], lists[2*i + 1]);
                temp_lists.push_back(temp);
            }

            if (lists.size() % 2) temp_lists.push_back(lists[lists.size() - 1]);
            lists = temp_lists;
        }

        return lists[0];
    }

猜你喜欢

转载自blog.csdn.net/m0_37518259/article/details/80715934