leetcode 腾讯50题 13/50 合并k个有序列表

题目描述

合并kk个有序的单向链表。
链表结点的数据结构:

struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};

思路

这个题从题目描述来看是上一题的进阶版本,上一问求合并两个列表,这一问合并k个列表,为了可以复用上一问的代码,一个将问题拆分使之的一个子问题变成合并两个列表,这里采用一种成为递归分治的方法,将大的问题拆分为一个小的问题,在这个问题中,可以将合并k个列表想象为合并两个列表,而这两个列表就是前半段的一组列表,和后半段的一组列表,运用递归的方法,问题规模不断下降,直到最最后两端只有单一的元素,降阶为合并两个链表的问题,这就是递归吧,就是分治吧,大问题变为子问题,一直递归到边界

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* merge2Lists(ListNode *l1,ListNode *l2){//最小子问题,合并两个链表,代码和上一问完全一样,可以参考上一问
            ListNode *head = new ListNode(-1);
            ListNode *cur = head;
            while(l1&&l2){
                if(l1->val>l2->val){
                    cur->next=l2;
                    l2=l2->next;
                }else{
                    cur->next=l1;
                    l1=l1->next;
                }
                cur=cur->next;
            }
            cur->next=l1==NULL?l2:l1;
            return head->next;
        }
        
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        if(lists.size()==0)//空表,直接输出
            return NULL;
        if(lists.size()==1)//一个元素的表,直接输出
            return lists[0];
        
        int mid = (lists.size())/2;//切分链表,这是中点
        vector<ListNode*> left = vector<ListNode*>(lists.begin(), lists.begin() + mid);//左链
         vector<ListNode*> right = vector<ListNode*>(lists.begin()+mid, lists.end());//右链
        ListNode* l1 = mergeKLists(left);//归并左链表
        ListNode* l2 = mergeKLists(right);//归并右链表
        return merge2Lists(l1,l2);//合并左右链表
        
        
    }
};

猜你喜欢

转载自blog.csdn.net/qq_34673038/article/details/90142675
今日推荐