题解 | #合并k个已排序的链表#

合并k个已排序的链表

http://www.nowcoder.com/practice/65cfde9e5b9b4cf2b6bafa5f3ef33fa6

 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    class min{
        public:
        min(int v,int l1){
            value=v;
            location1=l1;
        }
        public:
        int value;
        int location1;
    };
    ListNode *mergeKLists(vector<ListNode *> &lists) {
        vector<int> location;
        int length=lists.size();
//         cout<<length;
//         cout<<lists[1]->val;
        for(int i=0;i<length;i++){
            location.push_back(0);
        }
        int count=length;
        min* min1=new min(1001,0);
        min* min2=new min(1001,0);
        ListNode* merge=new ListNode(0);
        ListNode*p=merge;
        while(count>=0){
            for(int i=0;i<length;i++){
                if(lists[i]!=NULL){
                     if(lists[i]->val<min2->value){
                         if(lists[i]->val<min1->value){
                             min2->value=min1->value;
                             min2->location1=min1->location1;
                             min1->value=lists[i]->val;
                             min1->location1=i;
//                              cout<<"存1";
                         }
                         else{
                             min2->value=lists[i]->val;
                             min2->location1=i;
//                              cout<<"存2";
                         }
                     }
                }
            }
            if(min1->value==1001) break;
            if(lists[min1->location1]->next!=NULL){
               if(lists[min1->location1]->next->val<min2->value){
                   min2->value=lists[min1->location1]->next->val;
                   min2->location1=min1->location1;
               }
            }
            if(min1->value!=1001){
                ListNode* p1=new ListNode(min1->value);
                lists[min1->location1]=lists[min1->location1]->next;
                p->next=p1;
                p=p->next;
                min1->value=1001;
                if(lists[min1->location1]==NULL) count-=1;
            }
            if(min2->value!=1001){
                ListNode* p2=new ListNode(min2->value);
                lists[min2->location1]=lists[min2->location1]->next;
                p->next=p2;
                p=p->next;
                min2->value=1001;
                if(lists[min2->location1]==NULL) count-=1;
            }
            p->next=NULL;
        }
        return merge->next;
    }
};

以上为c++代码,时间复杂度和空间复杂度都较低,因为采用一次记入两个最小值量,遍历lists表读取,读取出数后将lists表对应的链表后移,同时存入1001覆盖最小值(因为val取值低于1001) alt 可以看出结果是不错的

全部评论

相关推荐

蚂蚁 基架java (n+6)*16 签字费若干
点赞 评论 收藏
分享
点赞 评论 收藏
分享
11-14 16:13
已编辑
重庆科技大学 测试工程师
Amazarashi66:不进帖子我都知道🐮❤️网什么含金量
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务