23. Merge k Sorted Lists 合并k个链表

113 篇文章 0 订阅

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

1.我的思路      超时了

开辟一个n个的指针空间,用来存放每一个链表的当前运行到的节点,然后依次连入到root上


//
//  main.cpp
//  23. Merge k Sorted Lists
//
//  Created by zjl on 16/9/4.
//  Copyright © 2016年 zjl. All rights reserved.
//

#include <iostream>
#include <vector>
using namespace std;


struct ListNode {
        int val;
        ListNode *next;
        ListNode(int x) : val(x), next(NULL) {}
    };

vector<ListNode*> init(vector<vector<int>> num){
    
    vector<ListNode*>res;
    for(int i = 0; i < num.size(); i++){
        ListNode* root = new ListNode(0);
        ListNode* p = root;
        if(num[i].size() == 0){
            res.push_back(NULL);
        }else{
            for(int j = 0; j < num[i].size(); j++){
                ListNode* t = new ListNode(num[i][j]);
                p->next = t;
                p = p->next;
            }
            res.push_back(root->next);
        }
    }
    return res;
}


ListNode* mergeKLists(vector<ListNode*>& lists) {
    int n = lists.size();
    if(n == 0 || (lists.size() == 1 && lists[0] == NULL)) return NULL;
    ListNode* root = new ListNode(INT_MAX);
    ListNode* p = root;
    if(lists.size() == 1) return lists[0];
    vector<ListNode*>ptr;
    for(int i = 0; i < n; i++){
        if(lists[i] == NULL)
            ptr.push_back(NULL);
        else
            ptr.push_back(lists[i]);
    }
    while(p != NULL){
        ListNode* minn = new ListNode(INT_MAX);
        int pos = -1;
        for(int i = 0; i < n; i++){
            if(ptr[i] == NULL) continue;
            /*ListNode* t = ptr[i];
            if(p->val == t->val){
                ptr[i] = t->next;
                continue;
            }*/
            if(minn->val > ptr[i]->val){
                minn = ptr[i];
                pos = i;
            }
        }
        if(minn->val == INT_MAX){
            p->next = NULL;
            break;
        }else{
            p->next = minn;
            p = p->next;
            ptr[pos] = minn->next;
        }
    }
    return root->next;
}


int main(int argc, const char * argv[]) {
    // insert code here...
    vector<vector<int>>num={{1,1,2},{0,1,2,2}};
    vector<ListNode*>lists = init(num);
    ListNode* root = mergeKLists(lists);
    while(root != NULL){
        cout<<root->val<<" ";
        root = root->next;
    }
    return 0;
}


2. 别人的想法

两两合并,然后长度缩短一半....最后只剩下一个长度,即输出


/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* mergelist(ListNode* l1, ListNode* l2){
        if(l1 == NULL)
            return l2;
        if(l2 == NULL)
            return l1;
        if(l1->val < l2->val){
            l1->next = mergelist(l1->next, l2);
            return l1;
        }else{
            l2->next = mergelist(l1, l2->next);
            return l2;
        }
    }

    ListNode* mergeKLists(vector<ListNode*>& lists) {
        int n = lists.size();
        if(n == 0) return NULL;
        while(n > 1){
            for(int i = 0; i < n/2; i++){
                lists[i] = mergelist(lists[i], lists[n-1-i]);
            }
            n = (n+1) / 2;
        }
        return lists[0];
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值