题解 | #合并K个排好序的链表# C语言 辅助数组快排法与两两排序法

合并k个已排序的链表

http://www.nowcoder.com/practice/65cfde9e5b9b4cf2b6bafa5f3ef33fa6

两两排序法

struct ListNode* Merge(struct ListNode* pHead1, struct ListNode* pHead2 ) {
    //改变原两个链表的指针指向排成新链表 节省空间
    struct ListNode* H=malloc(sizeof(struct ListNode));
    struct ListNode* cur=H;
    while(pHead1!=NULL&&pHead2!=NULL)
    {
        if(pHead1->val<=pHead2->val)
        {
            cur->next=pHead1;
            cur=cur->next;
            pHead1=pHead1->next;
        }
        else
        {
            cur->next=pHead2;
            cur=cur->next;
            pHead2=pHead2->next;    
        }
    }
    //若是有一边链表未遍历完,可直接指向当前节点,原链表已排好序
    if(pHead1!=NULL)
    {
        cur->next=pHead1;
    }
    if(pHead2!=NULL)
    {
        cur->next=pHead2;
    }
    return H->next;
    // write code here
}
struct ListNode* mergeKLists(struct ListNode** lists, int listsLen ) {
    if(listsLen==0)
        return NULL;
    int i=0;
    while(1)
    {
        for(i=0;i<listsLen/2;i++)//将链表首尾互排直至中间
        {
            lists[i]=Merge(lists[i],lists[listsLen-i-1]);//排序链表迭代
        }
        if(listsLen==2)
            break;
        listsLen=listsLen%2==1?listsLen/2+1:listsLen/2;//对K为单双数的处理
        
    }
    return lists[0];
}

辅助数组快排法

int cmp(const void* a,const void* b)
{
    return *(int *)a-*(int *)b;
}
struct ListNode* mergeKLists(struct ListNode** lists, int listsLen ) {
    struct ListNode* result=malloc(sizeof(struct ListNode));
    struct ListNode* cur;
    int j=0;
    int num[100000];
    for(int i=0;i<listsLen;i++)//遍历lists的所有节点存入num中
    {
        cur=lists[i];
        while(cur!=NULL)
        {
            num[j++]=cur->val;
            cur=cur->next;
        }
    }
    qsort(num, j,sizeof(int), cmp);//升序快排
    cur=result;
    for(int i=0;i<j;i++)//创建链表
    {
        struct ListNode* temp=malloc(sizeof(struct ListNode));
        temp->val=num[i];
        temp->next=NULL;
        cur->next=temp;
        cur=cur->next;
    }
    return result->next;
}
全部评论

相关推荐

评论
7
收藏
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
11192次浏览 95人参与
# 你的实习产出是真实的还是包装的? #
1982次浏览 42人参与
# 米连集团26产品管培生项目 #
6059次浏览 216人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7666次浏览 43人参与
# 简历第一个项目做什么 #
31764次浏览 341人参与
# 重来一次,我还会选择这个专业吗 #
433597次浏览 3926人参与
# MiniMax求职进展汇总 #
24141次浏览 310人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
187239次浏览 1122人参与
# 牛客AI文生图 #
21454次浏览 238人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152486次浏览 888人参与
# 研究所笔面经互助 #
118979次浏览 577人参与
# 简历中的项目经历要怎么写? #
310407次浏览 4220人参与
# AI时代,哪些岗位最容易被淘汰 #
63913次浏览 828人参与
# 面试紧张时你会有什么表现? #
30521次浏览 188人参与
# 你今年的平均薪资是多少? #
213166次浏览 1039人参与
# 你怎么看待AI面试 #
180196次浏览 1258人参与
# 高学历就一定能找到好工作吗? #
64342次浏览 620人参与
# 你最满意的offer薪资是哪家公司? #
76565次浏览 374人参与
# 我的求职精神状态 #
448163次浏览 3129人参与
# 正在春招的你,也参与了去年秋招吗? #
363562次浏览 2638人参与
# 腾讯音乐求职进展汇总 #
160689次浏览 1112人参与
# 校招笔试 #
471336次浏览 2964人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务