题目 合并k个有序链表
23. 合并 K 个升序链表https://leetcode.cn/problems/merge-k-sorted-lists/
困难
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
示例 1:
输入:lists = [[1,4,5],[1,3,4],[2,6]] 输出:[1,1,2,3,4,4,5,6] 解释:链表数组如下: [ 1->4->5, 1->3->4, 2->6 ] 将它们合并到一个有序链表中得到。 1->1->2->3->4->4->5->6
示例 2:
输入:lists = [] 输出:[]
1.思路分析
本题思路非常清晰:
1.首先定义k个指针,分别指向k个链表表头
2.定义一个新链表
3.选出k个指针指向数据最小的一个,送入新链表
4.循环上述过程,直到所有指针均为NILL
为此,需要一个检查K个指针指向数据最小的函数:
int minlist(struct ListNode** s,int size){
struct ListNode* p=(struct ListNode*)malloc(sizeof(struct ListNode));
p->val=10001;
int count=0;
if(p!=NULL){
for(int i=0;i<size;i++){
if(s[i]!=NULL)
{
if(s[i]->val < p->val) {
count=i;
p->val=s[i]->val;
}
}
else continue;
}
}
return count;
}
2.AC代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
bool empty(struct ListNode ** s,int size){
for(int i=0;i<size;i++){
if(s[i]!=NULL) return false;
}
return true;
}
int minlist(struct ListNode** s,int size){
struct ListNode* p=(struct ListNode*)malloc(sizeof(struct ListNode));
p->val=10001;
int count=0;
if(p!=NULL){
for(int i=0;i<size;i++){
if(s[i]!=NULL)
{
if(s[i]->val < p->val) {
count=i;
p->val=s[i]->val;
}
}
else continue;
}
}
return count;
}
struct ListNode* mergeKLists(struct ListNode** lists, int listsSize){
struct ListNode** arr=(struct ListNode**)malloc(listsSize*sizeof(struct ListNode*));
for(int i=0;i<listsSize;i++) arr[i]=lists[i];
struct ListNode* returnlist=(struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* s=returnlist;
s->next=NULL;
while(!empty(arr,listsSize)){
int t=minlist(arr,listsSize);
s->next=arr[minlist(arr,listsSize)];
s=s->next;
arr[t]=arr[t]->next;
}
return returnlist->next;
}