Leetcode之合并K个排序链表

题目描述

合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。

思路

  1. 首先遍历所有链表,将对应的数值保存到数组中,之后遍历数组创建新的链表即可
  2. 分治:每个链表先与下一个链表融合,这样讲链表总数从k将至k/2,重复直至链表总数为1,返回头部指针即可

代码

方法一:

class Solution {
public:
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        if(lists.size()==0)
            return NULL;
        vector<int> res;
        for(int i = 0; i < lists.size();i++)
        {
            ListNode* head = lists[i];
            while(head!=NULL)
            {
                res.push_back(head->val);
                head = head->next;
            }
        }
        if(res.size()==0)
            return NULL;
        sort(res.begin(),res.end());
        ListNode* res_head = new ListNode(res[0]);
        ListNode* cur = res_head;
        for(int i = 1;i<res.size();i++)
        {
            ListNode* next = new ListNode(res[i]);
            cur->next = next;
            cur = cur->next;
        }
        return res_head;
    }
};

方法二:

class Solution {
public:
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        if(lists.size()==0)
            return NULL;
        while(lists.size()>1)
        {
            int size = lists.size();
            int i = 0;
            for(; i < size ;i=i+2)
            {
                if(i+1 <size)
                {
                    if(lists[i] && lists[i+1]) /*判断头部是否均为空,均不为空则融合,一个为空则将不为空的压入,都为空则跳过即可*/
                    {
                        if(lists[i]->val >lists[i+1]->val)
                            lists.push_back(mergeTwoLists(lists[i+1],lists[i]));
                        else
                            lists.push_back(mergeTwoLists(lists[i],lists[i+1]));
                    }
                    else if(lists[i] == NULL && lists[i+1]) 
                            lists.push_back(lists[i+1]);
                    else if(lists[i+1] == NULL && lists[i])
                            lists.push_back(lists[i]);
                }
            }
            if(size%2==0)
                lists.erase(lists.begin(),lists.begin()+size);
            else
                lists.erase(lists.begin(),lists.begin()+size-1);
        }
        return lists[0];
    }
    ListNode* mergeTwoLists(ListNode* l1,ListNode* l2)
    {
        ListNode* res_head = l1;
        ListNode* cur = res_head;
        l1 = l1->next;
        while(l1 != NULL || l2 !=NULL)
        {
            if(l1 == NULL)
            {
                cur->next = l2;
                break;
            }
            else if(l2 == NULL)
            {
                cur->next = l1;
                break;
            }
            else
            {
                if(l1->val > l2->val)
                {
                    cur->next = l2;
                    l2 = l2->next;
                }
                else
                {
                    cur->next = l1;
                    l1 = l1->next;
                }
                cur = cur->next;
            }
        }
        return res_head;
    }
};
发布了85 篇原创文章 · 获赞 0 · 访问量 363

猜你喜欢

转载自blog.csdn.net/weixin_38312163/article/details/105106521
今日推荐