题目描述
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
解题思路
这个题目显然是可以用归并排序(区间内单调)的方法——最核心的地方就是合并两个有序链表(力扣第21)
同时也可以用优先级队列的方法,不过要修改比较方法(仿函数)。在优先级队列的方法中,有一个很重要的点,就是把所以节点的后续节点(next)制空,避免出现节点指向出现问题。
代码
归并排序
/**
* 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* mergeKLists(vector<ListNode*>& lists) {
if(lists.size()==0) return nullptr;
return merge(lists,0,lists.size()-1);
}
ListNode* merge(vector<ListNode*>& lists,int left,int right)
{
if(left==right) return lists[left];
int mid=(left+right)>>1;
ListNode* l=merge(lists,left,mid);
ListNode* r=merge(lists,mid+1,right);
ListNode* phead=new ListNode;
ListNode* cur=phead;
//合并两个有序链表
while(l&&r)
{
if(l->val<r->val) cur->next=l,l=l->next;
else cur->next=r,r=r->next;
cur=cur->next;
}
if(l) cur->next=l;
else cur->next=r;
return phead->next;
}
};
优先级队列
/**
* 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 {
struct cmp
{
bool operator()(ListNode* a,ListNode* b)
{
if(a->val<b->val) return false;
return true;
}
};
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
priority_queue<ListNode*,vector<ListNode*>,cmp> pq;
for(auto cur:lists)
{
while(cur)
{
pq.push(cur);
cur=cur->next;
}
}
ListNode* phead=new ListNode;
ListNode* cur=phead;
while(pq.size()!=0)
{
//重点,最关键
pq.top()->next=nullptr;
cur->next=pq.top();
cur=cur->next;
pq.pop();
}
return phead->next;
}
};
标签:ListNode,cur,23,int,lists,next,链表,升序
From: https://blog.csdn.net/m0_60598323/article/details/139080730