leetcode.23.合并K个升序链表.详解笔记.

文章提供了一种合并K个有序链表的方法,通过迭代将链表两两合并。首先使用合并两个有序链表的函数,然后在主函数中创建一个空指针,遍历给定的链表集合,每次将当前的空指针与下一个链表合并,直到所有链表合并完成。过程中使用size_t类型来安全地遍历vector容器中的ListNode指针。
摘要由CSDN通过智能技术生成

思路:

题目要求合并K个有序链表,联想到合并两个有序链表,可以直接应用合并两个有序链表的函数,在主函数中创建一个空指针,遍历给定的链表集,两个两个合并,遍历完成也就合并完成。关键是把把合并两个链表思想与本题联系起来,并想到一开始用空指针起头串联。

这里注意遍历过程中,变量i要用size_t类型,它是一个基本的与机器相关的无符号整数的C/C + +类型, 是sizeof操作符返回的结果类型,该类型的大小可选择。其大小足以保证存储内存中对象的大小,可以基本安全地存放指针。因为给定参数是一个vector容器,容器内全部都是ListNode*类型,所以最好用size_t类型遍历。

具体代码及注释如下:

/**
 * 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*list1,ListNode*list2){//合并两个链表
        ListNode*dummy=new ListNode;ListNode*pre=dummy;
        while(list1||list2){
            if(!list1){pre->next=list2;break;}
            if(!list2){pre->next=list1;break;}
            if(list1->val<list2->val){
                pre->next=list1;list1=list1->next;
            }
            else{pre->next=list2;list2=list2->next;}
            pre=pre->next;
           
        }
        return dummy->next;
    }
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        ListNode*ans=nullptr;//创建一个空指针
        for(size_t i=0;i<lists.size();i++){//逐个与给定的K个链表合并
            ans=mergetwolists(ans,lists[i]);
        }
        return ans;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值