LeetCode 23题:合并K个升序链表——C语言

文章目录

目录

题目

思路

代码

总结


题目

给你一个链表数组,每个链表都已经按升序排列。

请你将所有链表合并到一个升序链表中,返回合并后的链表。

示例 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 = []
输出:[]

示例 3:

输入:lists = [[]]
输出:[]

提示:

  • k == lists.length
  • 0 <= k <= 10^4
  • 0 <= lists[i].length <= 500
  • -10^4 <= lists[i][j] <= 10^4
  • lists[i] 按 升序 排列
  • lists[i].length 的总和不超过 10^4

思路

这个题的总体思路与合并两个有序链表 类似,见代码

代码

这是有lists[]中元素有头结点的代码

#include<stdio.h>
#include<stdlib.h>

typedef struct ListNode {
    int val;
      struct ListNode *next;
}Node;

void Creat(struct ListNode** head);
struct ListNode* mergeKLists(struct ListNode** lists, int listsSize);

int main()
{
    Node*link1,*link2,*link3;
    Creat(&link1);
    Creat(&link2);
    Creat(&link3);
    Node*list[3]={link1,link2,link3};
    Node*res=mergeKLists(list,3);
    res=res->next;
    while(res!=NULL)
    {
        printf("%d ",res->val);
        res=res->next;
    }
    return 0;
}

struct ListNode* mergeKLists(struct ListNode** lists, int listsSize)
{
    for(int i=1;i<listsSize;i++)
    {
        struct ListNode*ins=lists[0];
        if(ins==NULL)
        {
            return lists[0];
        }
        if(lists[i]==NULL)
        {
            continue;
        }
        lists[i]=lists[i]->next;
        while(ins->next!=NULL&&lists[i]!=NULL)
        {
            if(ins->next->val<lists[i]->val)
            {
                ins=ins->next;
            }
            else if(ins->next->val>=lists[i]->val)
            {
                struct ListNode*temp=lists[i];
                lists[i]=lists[i]->next;
                temp->next=ins->next;
                ins->next=temp;
                ins=ins->next;
            }
        }
        if(ins->next==NULL)
        {
            ins->next=lists[i];
        }
    }
    if(lists==NULL)
    return NULL;
    return lists[0];
}
void Creat(struct ListNode** head)
{
    *head=(Node*)malloc(sizeof(Node));
    int n;
    (*head)->next=NULL;
    scanf("%d",&n);
    Node*end,*ins;
    end=*head;
    for(int i=0;i<n;i++)
    {
        ins=(Node*)malloc(sizeof(Node));
        int a;
        scanf("%d",&a);
        ins->val=a;
        ins->next=NULL;
        end->next=ins;
        end=ins;
    }
}

而LeetCode上lists[i]是没有头结点的,主要函数代码是:

struct ListNode* mergeKLists(struct ListNode** lists, int listsSize)
{
    int less=INT_MAX,t=0;
    struct ListNode*ins;
    for(int i=0;i<listsSize;i++)
    {
       if(lists[i]!=NULL&&lists[i]->val<less)
       {
           ins=lists[i];
           t=i;
            less=lists[i]->val;
        } 
    }
    for(int i=0;i<listsSize;i++)
    {
        ins=lists[t];
        if(lists[i]==NULL||i==t)
        {
            continue;
        }
        while(ins->next!=NULL&&lists[i]!=NULL)
        {
            if(ins->next->val<lists[i]->val)
            {
                ins=ins->next;
            }
            else if(ins->next->val>=lists[i]->val)
            {
                struct ListNode*temp=lists[i];
                lists[i]=lists[i]->next;
                temp->next=ins->next;
                ins->next=temp;
                ins=ins->next;
            }
        }
        if(ins->next==NULL)
        {
            ins->next=lists[i];
        }
    }
    if(listsSize==0)
    return NULL;
    return lists[t];
}

总结

以上就是今天要讲的内容,继续练习。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流光焰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值