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

剑指offer-16、合并两个有序链表

题⽬描述

输⼊两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满⾜单调不减规则。

如输⼊{1,3,5} , {2,4,6} 时,合并后的链表为{1,2,3,4,5,6} ,所以对应的输出为{1,2,3,4,5,6} ,转换过程如下图所示:

思路及解答

迭代法(双指针)

使用两个指针分别遍历两个链表,比较当前节点的值,将较小的节点连接到结果链表上。当一个链表遍历完后,将另一个链表的剩余部分直接连接到最后。

public ListNode mergeTwoLists(ListNode l1, ListNode l2) {// 创建哑节点作为合并后链表的头节点前驱ListNode dummy = new ListNode(-1);ListNode current = dummy;while (l1 != null && l2 != null) {if (l1.val <= l2.val) {current.next = l1;l1 = l1.next;} else {current.next = l2;l2 = l2.next;}current = current.next;}// 连接剩余部分current.next = (l1 != null) ? l1 : l2;return dummy.next;
}
  • 时间复杂度​:O(n+m),n和m分别是两个链表的长度
  • 空间复杂度​:O(1),只使用了固定数量的指针

递归比较

利用递归将问题分解:每次比较两个链表的头节点,选择较小的节点作为合并后链表的头节点,然后递归地合并剩余部分。

public ListNode mergeTwoLists(ListNode l1, 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;}
}
  • 时间复杂度​:O(n+m),每个节点都会被访问一次
  • 空间复杂度​:O(n+m),递归调用栈的深度
http://www.sczhlp.com/news/426.html

相关文章:

  • 门店
  • 自定义控件----流动线条
  • 7.28总结
  • 2023年八大最佳Codecademy替代平台
  • 扩散模型-一张图片是一个概率分布采样的结果-94 - jack
  • 移远EC800K, EG800AK的 openSDK 编译
  • V-Ray 7 安装图解教程 | 支持3ds Max 2021-2026 含语言补丁配置
  • 2025暑假作业(7.28~8.3)
  • sed基础
  • 如果你还有一些困惑 / 请贴着我的心倾听 - Urd
  • 【IEEE出版】第五届计算机应用、视觉与算法国际学术会议(CVAA 2025)
  • 【SPIE出版】第二届生物医药和智能技术国际学术会议(ICBIT 2025)
  • 职业学院游戏发布
  • 一款可视化无代码的爬虫软件–EasySpider
  • 新手小白如何通过云服务器用Docker免费搭建web应用
  • 网站漏洞扫描工具-Acunetix
  • 生成深度图的图像模型–ZoeDepth
  • 如何复刻github的项目和共享自己的项目
  • 强大的论文解读工具-SciSpace Copilot
  • 可控图像工具--DrawGAN
  • 分享我经常使用的神器小工具
  • easyspider使用教程
  • 干货来袭!5 分钟学会快速实现责任链,效率直接拉满!
  • AI 赋能的云原生应用:技术趋势与实践
  • 免费云端部署工具
  • 乐高模型开发工具-studio
  • 介绍几个AI绘画网站和AI换脸功能
  • Kaggle入门指南
  • 一些免费的线上学习网站
  • 写一个音乐爬虫