题目描述

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

示例:

输入:
[
  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) {
        //处理为空的时候
        if(lists.size()==0)
            return NULL;
        return merge2List(lists,0,lists.size()-1);
    }

    //类似归并排序
    ListNode* merge2List(vector<ListNode*>& lists, int start, int end)
    {
        if(start==end)
            return lists[start];
        //合并前半段链表集合
        ListNode *l1 = merge2List(lists, start, (start+end)/2);
        //合并后半段链表集合
        ListNode *l2 = merge2List(lists, (start+end)/2+1, end);
        //然后再将这两个链表合并
        return merge(l1,l2);
    }

    //合并两个链表
    ListNode* merge(ListNode* l1,ListNode* l2)
    {
        ListNode* head = new ListNode(0);
        ListNode* tmp = head;

        while(l1!=NULL && l2!=NULL)
        {
            if(l1->val<l2->val)
            {
                tmp->next = l1;
                l1 = l1->next;
            }
            else
            {
                tmp->next = l2;
                l2=l2->next;
            }
            tmp = tmp->next;
        }

        if(l1==NULL)
            tmp->next = l2;
        else
            tmp->next = l1;

        return head->next;
    }

};