概述
题目描述
合并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);//合并左右链表
}
};
最后
以上就是粗犷招牌为你收集整理的leetcode 腾讯50题 13/50 合并k个有序列表题目描述思路的全部内容,希望文章能够帮你解决leetcode 腾讯50题 13/50 合并k个有序列表题目描述思路所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复