当前位置: 首页 > news >正文

双指针合并升序链表(双解)

题目

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

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

Python双解法

解法一(递归)

class Solution: def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]: if not list1: return list2 if not list2: return list1 if list1.val < list2.val: res = list1 res.next = self.mergeTwoLists(list1.next,list2) else : res = list2 res.next = self.mergeTwoLists(list1,list2.next) return res

代码核心在于if-else语句中的递归逻辑

每次选值更小的那个节点当 “当前头”

把它的next指向剩下两个链表的合并结果

递归到底,最后串成一条有序链表

解法二(迭代)

class Solution: def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]: dummy = ListNode(-1) cur = dummy while list1 and list2: if list1.val < list2.val: cur.next = list1 list1 = list1.next else: cur.next = list2 list2 = list2.next cur = cur.next cur.next = list1 if list1 else list2 return dummy.next

关键在于,while循环语句和最后的链表拼接

如果2的值大于1,则创建链表的节点直接指向1的链表,链表1自身向后移动,链表2的情况也同理。

cur.next = list1 if list1 list2。剩下的链表最多只有一个不为空,可以直接拼接。

Java解法

解法一(递归)

class Solution { public ListNode mergeTwoLists(ListNode list1, ListNode list2) { if (list1 == null){ return list2; } if (list2 == null){ return list1; } if (list1.val < list2.val){ list1.next = mergeTwoLists(list1.next,list2); return list1; } else { list2.next = mergeTwoLists(list1,list2.next); return list2; } } }

解法二(迭代)

class Solution { public ListNode mergeTwoLists(ListNode list1, ListNode list2) { ListNode prehead = new ListNode(-1); ListNode cur = prehead; while (list1!=null && list2!=null){ if (list1.val <= list2.val){ cur.next = list1; list1 = list1.next; }else{ cur.next = list2; list2 = list2.next; } cur = cur.next; } cur.next = list1 == null ? list2 : list1; return prehead.next; } }

C语言解法

解法一(递归)

struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) { // 边界条件:一个为空,返回另一个 if (l1 == NULL) { return l2; } if (l2 == NULL) { return l1; } // 谁小谁当头,递归合并剩下的 if (l1->val < l2->val) { l1->next = mergeTwoLists(l1->next, l2); return l1; } else { l2->next = mergeTwoLists(l1, l2->next); return l2; } }

解法二(迭代)

struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) { // 创建虚拟头节点(dummy) struct ListNode* dummy = (struct ListNode*)malloc(sizeof(struct ListNode)); dummy->val = -1; dummy->next = NULL; // 工作指针,用来拼接链表 struct ListNode* cur = dummy; // 两个链表都不为空时,谁小拼接谁 while (l1 != NULL && l2 != NULL) { if (l1->val <= l2->val) { cur->next = l1; l1 = l1->next; } else { cur->next = l2; l2 = l2->next; } cur = cur->next; // 指针后移 } // 拼接剩余部分 cur->next = (l1 != NULL) ? l1 : l2; // 返回真正的头节点 return dummy->next; }

总结

此题运用了递归和迭代两种方法,并且多种语言对比,有助于大家加深语言印象。

http://www.jsqmd.com/news/537772/

相关文章:

  • 2026年粘合剂厂家推荐:河南建杰实业有限公司,多品类粘合剂专业供应,服务全球市场 - 品牌推荐官
  • 【探讨解析】RTO可燃气体检测仪:哪些厂家品牌质量可靠? - 品牌推荐大师
  • 在openEuler(昇腾平台)上基于Conda安装CANN和PyTorch的完整过程
  • 2025-2026年提干辅导培训机构推荐:部队体系背景师资与精准押题口碑品牌分析 - 十大品牌推荐
  • 明日方舟自动化助手MAA:解放双手的终极游戏伴侣
  • 携程任我行卡回收最佳攻略:轻松变现的秘诀 - 团团收购物卡回收
  • 零基础玩转OpenClaw:星图GPU百川2-13B量化镜像体验报告
  • 告别手动描点:如何用WebPlotDigitizer实现科学图表数据的精准提取
  • 2026年天津本地防水服务商综合实力排名与选购指南 - 2026年企业推荐榜
  • 2026年提干辅导培训机构推荐:部队士兵考学系统规划高口碑机构与提分效果分析 - 十大品牌推荐
  • PyTorch 2.8镜像部署实操:RTX 4090D运行ComfyUI+Diffusers视频工作流
  • 土壤呼吸测定仪厂家有哪些?2026年值得关注的品牌一览 - 品牌推荐大师
  • Banana Vision Studio与MySQL集成:工业设计数据库管理系统
  • GLM-OCR与Keil5联动设想:嵌入式设备调试日志的图像识别分析
  • 如何快速回收携程任我行卡并实现高效变现? - 团团收购物卡回收
  • 3步打造静音ThinkPad:双风扇控制技术指南
  • 非支配排序遗传算法NSGA-III详解与MATLAB实现
  • 3分钟掌握终极ASCII艺术转换:免费将图片视频变成字符画的神奇工具 [特殊字符]
  • 深入理解 Python 数据模型:一切皆为对象
  • 科学图表数据提取全攻略:从图像到数值的高效转化技术
  • 每日算法练习:LeetCode 13. 罗马数字转整数 ✅
  • SQL核心操作笔记:索引创建与数据查询全解析(附实例)
  • Llama-3.2V-11B-cot部署教程:双卡4090一键启动视觉推理工具
  • C++的std--ranges资源清理
  • 京东智能抢购解决方案:告别手慢无的自动化下单工具
  • 2026年提干辅导培训机构推荐:部队考生碎片化时间利用与薄弱科目强化辅导服务分析 - 十大品牌推荐
  • 毕业论文神器 9个一键生成论文工具:全行业通用测评+高效写作推荐
  • Go gRPC 流式通信实现与优化
  • Linux静态库与共享库开发实践指南
  • 别再用time.time()测速了!(金融计算性能评估黄金标准:Wall-clock + CPU-cycle + L3-cache-miss三维校准法)