23. Merge k Sorted Lists

来源:互联网 发布:学习c语言游戏开发 编辑:程序博客网 时间:2024/06/05 02:23

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


由题意得,就是给出K个排序好的链表序列,然后把它们都合并起来。因为这一题的上一个题目是merge two sorted lists,所以每次都合并两个序列,然后就可以了,但是显然这样时间复杂度比较高,大概为O(k*n),其中n为链表的平均长度,代码如下。

Code(LeetCode运行293ms)

/** * 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 NULL;        }        ListNode *p = lists[0];        for (int i = 1; i < lists.size(); i++) {            p = mergeTowLists(p, lists[i]);        }        return p;    }        ListNode* mergeTowLists(ListNode* l1, ListNode* l2) {        ListNode head(INT_MIN);        ListNode *pointer = &head;        while (l1 != NULL && l2 != NULL) {            if (l1 -> val <= l2 -> val) {                pointer -> next = l1;                l1 = l1 -> next;            } else {                pointer -> next = l2;                l2 = l2 -> next;            }            pointer = pointer -> next;        }        if (!l1) {            pointer -> next = l2;        } else {            pointer -> next = l1;        }        return head.next;    }};
其实还可以进一步减少一点复杂度,例如是先把序列中的链表先两两合并,然后再合并,一直到合并成一个序列,这样的话时间复杂度为O(k*logn),具体代码不写了,因为也是复用了mergeTwoSortedLists,改一下主函数里的代码就好了。


原创粉丝点击