Merge k Sorted Lists

来源:互联网 发布:软件外包群 编辑:程序博客网 时间:2024/06/05 20:30

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
思路:两个链表合并的延伸,最简单的方法是,lists中的链表以此合并即:1和2合并;(1+2)和3合并,。。。。以此类推,直到全部合并完,假设链表的平均长度为n,显然需要遍历的链表节点数为(2+3+4+…+k)n,时间复杂度为O(nk^2).
代码如下:

/** * Definition for singly-linked list. * struct ListNode { *     int val; *     ListNode *next; *     ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public:    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {        if(l1 == NULL)            return l2;        if(l2 == NULL)            return l1;        if(l1->val > l2->val)//l1的首个元素保持最小            swap(l1, l2);        ListNode *p = l1, *q = l2, *pre;        while(p && q){            if(p->val <= q->val){                pre = p;                p = p->next;            }            else{                ListNode *tmp = new ListNode(q->val);                tmp->next = pre->next;                pre->next = tmp;                pre = pre->next;                q = q->next;            }        }        if(q)            pre->next = q;        return l1;    }    ListNode* mergeKLists(vector<ListNode*>& lists) {        if(lists.empty() || lists.size() == 0)            return NULL;        int len = lists.size();        if(len == 1)            return lists[0];        ListNode* ret = NULL;        for(int i = 0; i < len; ++i)            ret = mergeTwoLists(ret, lists[i]);        return ret;    }};

测试后发现超时,优化的思路是链表合并采用两个两个合并的方式,也就是分治的思想,这样能将合并的次数由k降为logk,因此时间复杂度为O(nklogk),测试通过,代码如下:

/** * Definition for singly-linked list. * struct ListNode { *     int val; *     ListNode *next; *     ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public:    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {        if(l1 == NULL)            return l2;        if(l2 == NULL)            return l1;        if(l1->val > l2->val)//l1的首个元素保持最小            swap(l1, l2);        ListNode *p = l1, *q = l2, *pre;        while(p && q){            if(p->val <= q->val){                pre = p;                p = p->next;            }            else{                ListNode *tmp = new ListNode(q->val);                tmp->next = pre->next;                pre->next = tmp;                pre = pre->next;                q = q->next;            }        }        if(q)            pre->next = q;        return l1;    }    ListNode* mergeKLists(vector<ListNode*>& lists) {        int n = lists.size();        if(n == 0)return NULL;        while(n >1)        {            int k = (n+1)/2;            for(int i = 0; i < n/2; i++)                lists[i] = mergeTwoLists(lists[i], lists[i + k]);            n = k;        }        return lists[0];    }};
0 0
原创粉丝点击