leetcode题库——合并k个排序链表

版权声明: https://blog.csdn.net/Dorothy_Xue/article/details/83422030

题目描述:

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

示例:

输入:
[
  1->4->5,
  1->3->4,
  2->6
]
输出: 1->1->2->3->4->4->5->6

方法:

/**
 * 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) {
        ListNode* h0=NULL;
        ListNode* fi;
        if(lists.size()!=0)//删掉所有空表
            for(int i=0;i<lists.size();i++)
                if(lists[i]==NULL)
                    lists.erase(lists.begin()+i);
        if(lists.size()==0) return h0;
        if(lists.size()==1) return lists[0];
        ListNode* flag=merge(lists[0],lists[1]);
        if(lists.size()==2) return flag;
        else
            for(int i=2;i<lists.size();i++)
                flag=merge(flag,lists[i]);
        return flag;
    }
    ListNode* merge(ListNode* l1,ListNode* l2)
    {
        ListNode *h,*p,*q,*s,*t;
        if(l1==NULL) return l2;
        if(l2==NULL) return l1;
        h=(struct ListNode*)malloc(sizeof(ListNode));
        p=l1;q=l2;s=h;
        while(p!=NULL&&q!=NULL)
        {
            if(p->val < q->val)
            {
                s->next=p;
                p=p->next;
                s=s->next;
                continue;
            }
            if(p->val >= q->val)
            {
                s->next=q;
                q=q->next;
                s=s->next;
                continue;
            }
        }
        if(p==NULL&&q!=NULL) s->next=q;
        if(q==NULL&&p!=NULL) s->next=p;
        s=h->next;
        return s;
    }
};

思路:

首先删掉所有空表;然后对剩下的链表进行合并,从前往后依次合并(((1,2),3),4)......这种。这里合并时可以用之前的合并两个有序链表的方法:https://blog.csdn.net/Dorothy_Xue/article/details/83347027

在此之前尝试用过类似于二路归并的方法,但是在每次合并后,两个链表合二为一,lists中删掉一个节点后,vector下标有所变化,对之后的merge会产生影响,以至报错,经过数小时调试无果,遂放弃。

猜你喜欢

转载自blog.csdn.net/Dorothy_Xue/article/details/83422030