23. 合并 K 个升序链表

一个一个合并列表

假如有4个列表a,b,c,d

先合并ab,然后abc,然后abcd;

定义一个merge函数合并两个列表,利用双指针,对两个列表进行归并排序

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    //两个列表合并函数
    ListNode* mergeTwoLists(ListNode *a,ListNode *b){
        // 如果a空或者b空 返回另一个链表
        if((!a)||(!b)) return a?a:b;
        // 定义头指针、尾指针,以及双指针a、b
        ListNode head,*tail = &head,*aPtr = a,*bPtr=b;
        // a、b都不为空,就一直循环
        while(aPtr && bPtr){
            if(aPtr->val < bPtr->val){
                tail->next = aPtr;
                aPtr = aPtr->next;
            }else{
                tail->next = bPtr;
                bPtr = bPtr->next;
            }
            tail = tail->next;
        }
        // 一个链表已经空了,补齐另一个还没空链表元素进尾部
        tail->next = (aPtr ? aPtr:bPtr);
        return head.next;
    }
    ListNode* mergeKLists(vector& lists) {
        ListNode *res = nullptr;
        // 列表一个一个合并
        for(int i = 0;i

时间复杂度O(k^2 * n):k为列表数目,n是平均每个列表的元素个数

空间复杂度O(1)

你可能感兴趣的:(链表,算法,数据结构)