合并两个有序链表和合并 K 个升序链表

devtools/2024/11/13 15:47:09/

21. 合并两个有序链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 

示例 1:

输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]

示例 2:

输入:l1 = [], l2 = []
输出:[]

示例 3:

输入:l1 = [], l2 = [0]
输出:[0]
/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {//判空if(list1==NULL){return list2;}if(list2==NULL){return list1;}//创建新的节点struct ListNode* NewHead ,*NewTail;NewHead=NewTail = (struct ListNode*)malloc(sizeof(struct ListNode));struct ListNode*l1=list1;struct ListNode*l2=list2;while(l1&&l2){if(l1->val>l2->val){NewTail->next = l2;NewTail=NewTail->next;l2=l2->next;}else{NewTail->next = l1;NewTail=NewTail->next;l1=l1->next;} }//出来就两种情况,要l1先走完,或l2先走完if(l1){NewTail->next=l1;}if(l2){NewTail->next=l2;}//申请的节点要释放掉struct ListNode * ret = NewHead->next;free(NewHead);NewHead =NULL;return ret;
}

23. 合并 K 个升序链表

困难

示例 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 = [[]]
输出:[]
/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/struct ListNode*mergeTwoList(struct ListNode*l1,struct ListNode*l2){if(l1==NULL)return l2;if(l2==NULL)return l1;if(l1->val<l2->val){l1->next=mergeTwoList(l1->next,l2);return l1;}else{l2->next = mergeTwoList(l1,l2->next);return l2;}}
struct ListNode* mergeKLists(struct ListNode** lists, int listsSize) {//判空if(lists==NULL||listsSize==0)return NULL;//分治int interval =1;while(interval<listsSize){for(int i =0;i<listsSize-interval;i+=2*interval){lists[i] = mergeTwoList(lists[i],lists[i+interval]);}interval*=2;}return lists[0];
}

 

假设我们有三个升序链表,每个链表中的元素分别为:

链表1:1 -> 4 -> 5

链表2:1 -> 3 -> 4

链表3:2 -> 6

我们的目标是将这三个链表合并成一个升序链表

初始时,我们设置interval为1,然后进入while循环。在第一次迭代中,我们将会合并两个链表,步长为2。

第一次迭代:

    •    合并lists[0]和lists[1],即链表1和链表2,得到结果:1 -> 1 -> 3 -> 4 -> 4 -> 5。
    •    合并lists[2]和空链表,因为lists[2]为空,所以结果仍为链表3:2 -> 6。

此时,interval乘以2,变为2。

第二次迭代:

    •    合并lists[0]和lists[2],即上一次合并后的结果和链表3,得到最终结果:1 -> 1 -> 2 -> 3 -> 4 -> 4 -> 5 -> 6。

由于此时interval已经大于等于listsSize,所以while循环结束,算法执行完成。

这就是使用分治法合并K个升序链表的具体执行过程,通过每次迭代合并两个子问题,并将子问题的规模逐步增大,最终得到合并后的结果。


http://www.ppmy.cn/devtools/45947.html

相关文章

Vue3生命周期

文章目录 前言初始化组件挂载组件更新组件卸载示意图 前言 每个vue实例在被创建都要经历一系列初始化的过程 在这个过程中会运行一些叫做生命周期钩子的函数 使用户可以在页面中不同的阶段执行代码 初始化 1.setup() 在组件实例化时调用&#xff0c;用于设置组件的状态和响应…

超声波清洗机哪个品牌更值得推荐?精选四大王牌臻品分享

近年来&#xff0c;随着人们对健康生活要求的提升&#xff0c;超声波清洗机在市场上的受欢迎程度逐渐攀升&#xff0c;产品的多样性也让人眼花缭乱。近期收到了大量读者的一些私信&#xff0c;其中很多人询问使用超声波清洗机会对眼镜有伤害吗、超声波清洗机是不是智商税、超声…

165.二叉树:对称二叉树(力扣)

代码解决 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* Tre…

英伟达A100算力卡性能及应用

英伟达A100是一款高性能计算卡&#xff0c;基于英伟达Ampere架构&#xff0c;专为数据中心和高性能计算领域设计。以下是关于A100的性能参数及应用的详细介绍&#xff1a; 性能参数 架构与制程&#xff1a; 架构&#xff1a;Ampere制程&#xff1a;7纳米核心与频率&#xff1…

【DevOps】深入了解RabbitMQ:AMQP协议基础、消息队列工作原理和应用场景

目录 一、核心功能 二、优势 三、核心概念 四、工作原理 五、交换机类型 六、消息确认 七、持久性和可靠性 八、插件和扩展 九、集群和镜像队列 十、客户端库 十一、管理界面 十二、应用场景 RabbitMQ是一个基于AMQP协议的消息队列中间件&#xff0c;提供高可用、可…

算法训练 | 回溯算法Part3 | 39.组合总和、40.组合总和II、131.分割回文串

目录 39.组合总和 回溯法 40.组合总和II 回溯法 131.分割回文串 回溯法 39.组合总和 题目链接&#xff1a;39. 组合总和 - 力扣&#xff08;LeetCode&#xff09; 文章讲解&#xff1a;programmercarl.com 回溯法 解题思路 本题没有数量要求&#xff0c;可以无限重复…

媳妇面试了一家公司,期望月薪20K,对方没多问就答应了,只要求3天内到岗,可我总觉得哪里不对劲。

“20k&#xff01;明天就来上班吧&#xff01;” 听到这句话&#xff0c;你会不会两眼放光&#xff0c;激动得差点跳起来&#xff1f; 朋友媳妇小丽&#xff0c;最近就经历了这样一场“梦幻面试”。然而&#xff0c;事情的发展却远没有想象中那么美好…… “这公司也太好了吧…

字节裁员!开启裁员新模式。。

最近&#xff0c;互联网圈不太平&#xff0c;裁员消息此起彼伏。而一向以“狼性文化”著称的字节跳动&#xff0c;却玩起了“低调裁员”&#xff0c;用一种近乎“温柔”的方式&#xff0c;慢慢挤掉“冗余”的员工。 “细水长流”&#xff1a;裁员新模式&#xff1f; 不同于以往…