合并K个升序链表

本文介绍了一种算法,如何将多个已按升序排列的链表合并成一个新的升序链表。通过维护一个vector存储n个指针,不断找到并插入最小元素,直至所有链表遍历完。
摘要由CSDN通过智能技术生成

给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。

思路: 

        对于两个升序链表的情况,我们很容易想到只需要利用两个指针将较小的元素放入新链表再后移相应指针,直到连个链表遍历完毕。对于n个链表,自然还可以想到利用n个指针,通过比较n个指针指向的链表元素大小,将最小的指针指向的元素填入新链表并后移当前指针即可。由此我们新建vector容器存储n个指针,只要容器不为空我们就寻找最小元素的指针并后移,当相应指针为空时代表链表遍历完毕,就把这个链表从容器内移除,当容器为空时,所有链表的元素都以排好序。

代码如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        ListNode *root = new ListNode;
        root->next = NULL;
        ListNode *p = root;
        if(lists.empty()){
            return nullptr;
        }
        vector<ListNode*> remainset;
        for(ListNode* hnode:lists){
            if(hnode != nullptr){
                remainset.push_back(hnode);
            }
        }
        int i;
        while(!remainset.empty()){
            int minmember = remainset[0]->val; 
            int index = 0;
            for(i = 1; i < remainset.size(); i++){
                if(remainset[i]->val < minmember){
                    minmember = remainset[i]->val;
                    index = i;
                }
            }
            p->next = remainset[index];
            remainset[index] = remainset[index]->next;
            p = p->next;
            p->next = nullptr;
            if(!remainset[index]){
                remainset.erase(remainset.begin()+index);
            }
        }
        if(root){
            return root->next;
        }
        return nullptr;
    }
};

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值