[Leetcode] Merge K sorted lists

来源:互联网 发布:网店数据化分析的概念 编辑:程序博客网 时间:2024/05/09 20:53

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

二分法可以降低复杂度。一遍通过,耶~

/** * 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) {        // Start typing your C/C++ solution below        // DO NOT write int main() function        if(lists.size()==0) return NULL;        int size = lists.size();        while(size>1)        {            int halfSize = (1+size)/2;            for(int i=0;i<halfSize && halfSize+i<size;i++) //重要!            {                ListNode *l1 = lists[i];                ListNode *l2 = lists[i+halfSize];                ListNode *result = mergeTwoLists(l1,l2);                lists[i] = result;            }            size = halfSize;                    }        return lists[0];            }        ListNode *mergeTwoLists(ListNode* list1,ListNode* list2)    {        ListNode* tmp1 = list1;        ListNode* tmp2 = list2;        ListNode* vHead = new ListNode(0);        ListNode* tmp = vHead;                while(tmp1&&tmp2)        {            if(tmp1->val<tmp2->val)            {                tmp->next = tmp1;                tmp1 = tmp1->next;            }            else            {                tmp->next = tmp2;                tmp2 = tmp2->next;            }            tmp = tmp->next;        }                while(tmp1)        {            tmp->next = tmp1;            tmp1 = tmp1->next;            tmp = tmp->next;        }        while(tmp2)        {            tmp->next = tmp2;            tmp2 = tmp2->next;            tmp = tmp->next;        }                return vHead->next;    }};