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

力扣题目学习笔记(OC + Swift)21. 合并两个有序链表

21. 合并两个有序链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
在这里插入图片描述

链表解题经典三把斧:

  • 哑巴节点
  • 快慢指针

此题比较容易想到的解法是迭代法,生成哑巴节点,然后迭代生成后续节点。

方法一、迭代法

Swift

func mergeTwoLists(_ list1: ListNode?, _ list2: ListNode?) -> ListNode? {guard list1 != nil else {return list2}guard list2 != nil else {return list1}var list1 = list1var list2 = list2let dummyNode = ListNode(-1);var prev:ListNode? = dummyNodewhile list1 != nil && list2 != nil {if list1!.val < list2!.val {prev?.next = list1list1 = list1!.next}else {prev?.next = list2list2 = list2!.next}prev = prev?.next}prev?.next = (list1 != nil) ? list1 : list2return dummyNode.next}

OC

//回溯法
- (ListNodeOC *_Nullable)mergeTwoLists:(ListNodeOC * _Nullable)list1list2:(ListNodeOC * _Nullable)list2 {if (!list1) {return list2;}if (!list2) {return list1;}ListNodeOC *dummyNode = [[ListNodeOC alloc] initWithVal:-1];ListNodeOC *pre = dummyNode;while (list1 && list2) {if (list1.val < list2.val) {pre.next = list1;list1 = list1.next;}else {pre.next = list2;list2 = list2.next;}pre = pre.next;}pre.next = list1 ? list1 : list2;return dummyNode.next;
}

方法二、递归法

代码简洁、思路清晰、稍占内存的解法。

Swift

func mergeTwoLists(_ list1: ListNode?, _ list2: ListNode?) -> ListNode? {guard let list1 = list1 else { return list2 }guard let list2 = list2 else { return list1 }if list1.val < list2.val {list1.next = mergeTwoLists(list1.next, list2)return list1}else {list2.next = mergeTwoLists(list1, list2.next)return list2}}

OC

//递归法
- (ListNodeOC * _Nullable)mergeTwoLists:(ListNodeOC * _Nullable)list1list2:(ListNodeOC * _Nullable)list2 {//递归终止条件if (!list1) {return list2;}if (!list2) {return list1;}if (list1.val < list2.val) {list1.next = [self mergeTwoLists:list1.next list2:list2];return list1;}else {list2.next = [self mergeTwoLists:list1 list2:list2.next];return list2;}
}

相关文章:

  • oracle定位造成卡顿的SQL语句
  • Python 查杀进程的方法封装
  • ThunderSearch(闪电搜索器)_网络空间搜索引擎工具_信息收集
  • unity HoloLens2开发,使用Vuforia识别实体 触发交互(二)(有dome)
  • Hadoop入门学习笔记——五、在虚拟机中部署Hive
  • c++11 标准模板(STL)(std::pair)(七)访问 pair 的一个元素
  • 【华为OD题库-110】反转每对括号间的子串-java
  • Promise,async和js的事件循环机制
  • FPFA.一种二倍频电路代码描述以及测量详情
  • jar混淆,防止反编译,Allatori工具混淆jar包
  • springboot对接WebSocket实现消息推送
  • SpringBoot 3 集成Hive 3
  • 第十五节TypeScript 接口
  • 【MySQL】:超详细MySQL完整安装和配置教程
  • 【网络编程】基于UDP数据报实现回显服务器程序
  • 0x05 Python数据分析,Anaconda八斩刀
  • conda常用的命令
  • JDK9: 集成 Jshell 和 Maven 项目.
  • k8s 面向应用开发者的基础命令
  • laravel with 查询列表限制条数
  • LeetCode算法系列_0891_子序列宽度之和
  • nfs客户端进程变D,延伸linux的lock
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • React16时代,该用什么姿势写 React ?
  • Redis 懒删除(lazy free)简史
  • Spring Cloud中负载均衡器概览
  • 初识 webpack
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 走向全栈之MongoDB的使用
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • # 安徽锐锋科技IDMS系统简介
  • (11)MSP430F5529 定时器B
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (poj1.3.2)1791(构造法模拟)
  • (ZT)薛涌:谈贫说富
  • (安卓)跳转应用市场APP详情页的方式
  • (十八)SpringBoot之发送QQ邮件
  • (转)Linq学习笔记
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • ***监测系统的构建(chkrootkit )
  • .Net 4.0并行库实用性演练
  • .net 发送邮件
  • .net的socket示例
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • [.net]官方水晶报表的使用以演示下载
  • []AT 指令 收发短信和GPRS上网 SIM508/548
  • [100天算法】-目标和(day 79)
  • [AIGC codze] Kafka 的 rebalance 机制
  • [boost]使用boost::function和boost::bind产生的down机一例
  • [bzoj4010][HNOI2015]菜肴制作_贪心_拓扑排序
  • [C puzzle book] types