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

21. 合并两个有序链表

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

链表解题经典三把斧:

  • 哑巴节点
  • 快慢指针

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

方法一、迭代法

Swift

swift 复制代码
func mergeTwoLists(_ list1: ListNode?, _ list2: ListNode?) -> ListNode? {
        guard list1 != nil else {
            return list2
        }

        guard list2 != nil else {
            return list1
        }

        var list1 = list1
        var list2 = list2

        let dummyNode = ListNode(-1);
        var prev:ListNode? = dummyNode

        while list1 != nil && list2 != nil {
            if list1!.val < list2!.val {
                prev?.next = list1
                list1 = list1!.next
            }else {
                prev?.next = list2
                list2 = list2!.next
            }
            prev = prev?.next
        }

        prev?.next = (list1 != nil) ? list1 : list2

        return dummyNode.next
    }

OC

c 复制代码
//回溯法
- (ListNodeOC *_Nullable)mergeTwoLists:(ListNodeOC * _Nullable)list1
                        		 list2:(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

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

c 复制代码
//递归法
- (ListNodeOC * _Nullable)mergeTwoLists:(ListNodeOC * _Nullable)list1
                                  list2:(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;
    }
}
相关推荐
一小路一2 小时前
通往 AI 之路:Python 机器学习入门-机器学习基本概念
人工智能·后端·python·学习·机器学习
JeffreyGu.6 小时前
Linux Shell脚本-分隔符问题
linux·服务器·学习
随机惯性粒子群6 小时前
wheel_legged_genesis 开源项目复现与问题记录
学习·开源·github·强化学习·genesis
云上艺旅6 小时前
K8S学习之基础十二:容器的三种探测
学习·容器·kubernetes
啥都想学的又啥都不会的研究生6 小时前
Redis设计与实现-数据结构
数据结构·数据库·redis·笔记·缓存·性能优化·skiplist
mit6.8246 小时前
[Lc(2)滑动窗口_1] 长度最小的数组 | 无重复字符的最长子串 | 最大连续1的个数 III | 将 x 减到 0 的最小操作数
数据结构·c++·算法·leetcode
kfepiza7 小时前
Python的循环和条件判断 笔记250303
开发语言·笔记·python
栀寒老醑7 小时前
模板注入漏洞(SSTI)学习笔记
笔记·学习·安全·web安全·网络安全·系统安全·安全架构
UQI-LIUWJ7 小时前
数据集/API 笔记:新加坡最新的停车场可用车位信息 & 停车场信息
笔记
Warren988 小时前
使用SLF4J + Logback进行日志记录:
java·开发语言·前端·javascript·笔记·intellij-idea·logback