vivo提前批笔试题记录(6.9)

1.leecode 23 合并k个有序链表
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6

K 条链表的总结点数是 N,平均每条链表有 N/K 个节点,因此合并两条链表的时间复杂度是 O(N/K)。从 K条链表开始两两合并成 1条链表,因此每条链表都会被合并 logK次,因此 K 条链表会被合并 K∗logK 次,因此总共的时间复杂度是 K∗logK∗N/K 即 O(NlogK)

//时间:O(NlogK) 空间:O(logk)
/**
 * 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;}
        return mergelist(lists,0,lists.size()-1);
        
        
    }
    ListNode* mergelist(vector<ListNode*>& lists,int l,int r){
        if(l==r){return lists[l];}
        int mid=l+(r-l)/2;
        ListNode* l1=mergelist(lists,l,mid);
        ListNode* l2=mergelist(lists,mid+1,r);
        return merge(l1,l2);

    }
    ListNode* merge(ListNode* list1,ListNode* list2){
        ListNode* node=NULL;
        if(list1==NULL){return node=list2;}
        if(list2==NULL){return node=list1;}

        if(list1->val<list2->val){
            node=list1;
            node->next=merge(list1->next,list2);
        }
        else{
            node=list2;
            node->next=merge(list1,list2->next);
        }
        return node;
        }
    
};

你可能感兴趣的:(vivo提前批笔试题记录(6.9))