题解 | 合并k个已排序的链表

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param lists ListNode类一维数组 
 * @param listsLen int lists数组长度
 * @return ListNode类
 */
//本题的解决思路来自左神的算法讲解027中所讲的第一题
void swap(struct ListNode** arr , int i , int j){
    struct ListNode* temp = arr[i];//交换这个两个节点的指针
    arr[i] = arr[j];
    arr[j] = temp;
}
void heapInsert(struct ListNode** arr , int i){
    while(arr[i]->val < arr[(i - 1) / 2]->val){
        swap(arr , i , (i - 1) / 2);
        i = (i - 1) / 2;
    }
}
void heapify(struct ListNode** arr , int i , int size){
    int l = i * 2 + 1;
    while(l < size){
        int best = l + 1 < size && arr[l + 1]->val < arr[l]->val ? l + 1 : l;
        best = arr[i]->val < arr[best]->val ? i : best;
        if(best == i) break;
        swap(arr , i , best);
        i = best;
        l = i * 2 + 1;
    }
}
struct ListNode* mergeKLists(struct ListNode** lists, int listsLen ) {
    struct ListNode* arr[5001];
    int size = 0;//用size表示堆的大小
    struct ListNode* head = NULL , *pre = NULL;
    for(int i = 0;i < listsLen;i++){
        pre = *(lists + i);//让pre指向lists中每个链表的头节点
        if(pre != NULL) {//当pre所指向的那个链表不是空链表时,把pre指向的节点放进堆里
            arr[size++] = pre;
            heapInsert(arr , size - 1);//保证每次堆里增加一个头节点后,根据头结点的值,arr仍为小根堆
        }
    }//通过向上调整的方法建立堆结构
    if(0 == size) return NULL;//判断堆里面有无链表
    head = pre = arr[0];//弹出堆的顶部节点(堆的最小值)作为新的链表的头部节点
    if(pre->next != NULL) arr[0] = pre->next;
    else swap(arr , 0 , --size);
    while(size > 0){
        heapify(arr , 0 , size);//传入参数:堆,要进行向下调整的节点的索引,堆的大小
        pre->next = arr[0];//新链表链接堆中的最小值
        pre = pre->next;
        if(arr[0]->next != NULL) arr[0] = arr[0]->next;//判断这一链表是否还有节点
        else swap(arr , 0 , --size);//如果没有了,那么就无视掉
    }
    pre->next = NULL;//给新链表的结尾连到NULL
    return head;//返回新链表的头部节点
}

全部评论

相关推荐

有四六级证书,专四证书经验:心理辅导站干事&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2021.10-2022.6○活动组织与协作:与干事合作开展学生比赛活动实施,参与&nbsp;“外国语学院晴朗杯比赛”&nbsp;和&nbsp;“第二届全国大学生心理健康知识竞赛”&nbsp;组织工作,包含研讨演讲主题、联络选手评委、线上线下推广、题目收集筛选及监考等,吸引超&nbsp;100&nbsp;人参与,获&nbsp;“心理辅导站工作积极分子”&nbsp;证书。○数据管理与分析:负责外国语学院班级心理报告(晴雨表)管理,用&nbsp;Excel&nbsp;整理分析数据,掌握学生心理状况并采取措施,为学院的心理健康工作提供了数据支持。○心理沟通与激励:参与校级心理培训,学习课程后在日常与同学交流,用目标和情感激励法缓解同学心理不适,不仅提升了自身抗压能力,还积累了与用户沟通的经验。第三党支部志愿服务队入党积极分子&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2022.4-2024.4○党建活动协助:协助党小组组长完成党日活动文案撰写、会议记录,参与档案整理、校区志愿服务、数据整合等志愿活动,解决师生问题。 ○内容创作与传播:与同志合作撰写发布&nbsp;“外国语学院博外之声”&nbsp;推文,阅读量&nbsp;2000&nbsp;+,传播党建动态,扩大党支部影响力,也为内容营销和品牌推广积累了经验。外国语学院“商务报告翻译”项目&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2023.10○商务知识学习:学习商务报告结构、语言、术语及翻译技巧。 ○团队翻译实践:与团队合作完成商务报告英翻中,确保语言准确专业。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务