思路:
题目要求合并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;
}
};