题解 | #合并k个已排序的链表#

合并k个已排序的链表

http://www.nowcoder.com/practice/65cfde9e5b9b4cf2b6bafa5f3ef33fa6

一种很简单的想法是将列表中的链表逐一和nullptr合并,但这样子时间复杂度很高。注释部分即为。
另一种明显的思路则是借鉴分治,将列表中的链表两两合并,最后返回结果。

/*
合并 k 个已排序的链表并将其作为一个已排序的链表返回。分析并描述其复杂度。
*/
class Solution {
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        if (!l1 && !l2) return l1;
        if (!l1) return l2;
        if (!l2) return l1;
        if (l1->val < l2->val) {
            l1->next = mergeTwoLists(l1->next, l2);
            return l1;
        }
        else {
            l2->next = mergeTwoLists(l1, l2->next);
            return l2;
        }
    }
    ListNode* merge(vector<ListNode*>& lists, int l, int r) {
        if (l == r)
            return lists[l];
        auto list1 = merge(lists, l, (l + r) / 2);
        auto list2 = merge(lists, (l + r) / 2 + 1, r);
        return
            mergeTwoLists(list1, list2);
    }
public:
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        if (!lists.size())
            return nullptr;
        if (lists.size() == 1)
            return lists[0];
        return merge(lists, 0, lists.size() - 1);
        //         ListNode* res=nullptr;
        //         for(ListNode* node:lists){
        //             res=mergeTwoLists(res, node);
        //         }
        //         return res;
    }
};
全部评论

相关推荐

11-24 11:23
门头沟学院 C++
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务