思路
有了合并两个链表的基础后,这个的一种方法就是可以进行顺序合并,我们可以先写一个函数用来合并两个链表,再在合并K个链表的的函数中循环调用它。
解题过程
解析这个函数
首先,可以先判断,如果a为空,则返回b。如果b为空,则返回a。
在合并链表时,我们需要一个head保存合并之后链表的头,我们可以把head设为一个虚拟的头(不保存val)。
其次,我们还需要一个指针(cur)记录下一个插入位置的前一个位置。
我们还需要设置pa,pb指针来对a,b链表进行遍历
当pa和pb都非空时:
若pa->val < pb->val,则将pa插入到cur的后面,pa向后移动一个。
若pa->val >= pb->val,则将pb插入到cur的后面,pb向后移动一个。
两个插入完之后,cur都需要向后移动一个,方便下次插入。
循环结束之后,运用三元运算符,若pa不为空,则cur直接接上pa剩下的。反之,接上pb。合并完链表后,返回head.next
遍历lists:
将空链表不断与list中的数据进行合并
最后返回ans。
代码
//顺序合并
class Solution {
public:
ListNode* mergeTwoLists(ListNode* a, ListNode* b)
{
if(!a)
return b;
if(!b)
return a;
ListNode head, *cur = &head, *pa = a, *pb = b;
while(pa && pb)
{
if(pa->val < pb->val)
{
cur->next = pa;
pa = pa->next;
}
else
{
cur->next = pb;
pb = pb->next;
}
cur = cur->next;
}
cur->next = (pa ? pa : pb);
return head.next;
}
ListNode* mergeKLists(vector<ListNode*>& lists) {
ListNode* ans = nullptr;
for(int i = 0; i < lists.size();i++)
{
ans = mergeTwoLists(ans, lists[i]);
}
return ans;
}
};