合并K个排序链表

你说的曾经没有我的故事 提交于 2020-01-12 21:54:34

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

示例:

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

思路:

1: 有k个排序的链表,我们可以先将两个链表进行合并。

2. 合并出来的链表在和一个链表合并,以此类推。

/**
 * 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) {
        int size = lists.size();
        if (size==0) return nullptr;
        if (size==1) return lists[0];
        ListNode* p= lists[0];
        for (int i=1; i<size; i++)
        {
            p=mergelist(p,lists[i]);
        }
        return p;
    }
    ListNode* mergelist(ListNode* list1, ListNode* list2)
    {
        ListNode* head= new ListNode(0);
        ListNode* p=head;
        while(list1&&list2)
        {
            if(list1->val<list2->val)
            {
                p->next= list1;
                list1=list1->next;
            }
            else
            {
                p->next= list2;
                list2=list2->next;
            }  
            p=p->next;          
        }
        while(list1)
        {
            p->next=list1;
            list1=list1->next;
            p=p->next;
        }
        while(list2)
        {
            p->next= list2;
            list2=list2->next;
            p=p->next;
        }
        return head->next;
    }
};

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!