合并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个已排序的链表

链表中的节点每K个一组翻转(NC50/考察次数Top12/难度中等)

删除有序链表中重复的元素-II(NC24/考察次数Top72/难度中等)

删除有序链表中重复的元素-II(NC24/考察次数Top72/难度中等)

删除有序链表中重复的元素-II(NC24/考察次数Top72/难度中等)

java牛客BM4.合并两个排序的链表 BM5. 合并k个已排序的链表