合并k个已排序的链表(NC51/考察次数Top37/难度较难)
Posted 码农指南
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了合并k个已排序的链表(NC51/考察次数Top37/难度较难)相关的知识,希望对你有一定的参考价值。
描述:
合并k个已排序的链表并将其作为一个已排序的链表返回。分析并描述其复杂度。
示例1
输入:
[{1,3,4},{2,5,6,7}]
返回值:
{1,2,3,4,5,6,7}
(题目来自牛客网)
用C++实现如下
/**
* 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*表示一个链表头,此类型的vector可以表示多个链表
//一个list用一个ListNode*节点,vector中有若干个list
//思路,可以采取一个个合并的想法来完成
if(lists.size() == 0)
return nullptr;
ListNode* head = nullptr;
for(int i = 0; i<lists.size(); ++i)
{
head = connectList(head, lists[i]); //循环调用connectList函数进行比较来连接
}
return head;
}
ListNode* connectList(ListNode* p1, ListNode* p2){
if(p1 == nullptr || p2 == nullptr)
return p1 == nullptr? p2:p1;
if(p1->val < p2->val){
p1->next = connectList(p1->next, p2); //从小到大排序,对于两个链表,再次调用递归进行解决
return p1;
}else{
p2->next = connectList(p2->next, p1);
return p2;
}
}
};
纯手撕代码,如果觉得内容不错麻烦点个赞,后面陆续配上Top100算法题通俗易懂的讲解视频,可以花两个月时间完全掌握,进大厂不是梦,转行狗亲测!
以上是关于合并k个已排序的链表(NC51/考察次数Top37/难度较难)的主要内容,如果未能解决你的问题,请参考以下文章
链表中的节点每K个一组翻转(NC50/考察次数Top12/难度中等)
删除有序链表中重复的元素-II(NC24/考察次数Top72/难度中等)
删除有序链表中重复的元素-II(NC24/考察次数Top72/难度中等)