力扣题目学习笔记(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 = 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

//回溯法
- (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

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)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;
    }
}

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2023-12-25 11:38:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-25 11:38:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-25 11:38:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-25 11:38:01       18 阅读

热门阅读

  1. 【WPF.NET开发】绑定源

    2023-12-25 11:38:01       35 阅读
  2. WPF Border

    2023-12-25 11:38:01       37 阅读
  3. Pandas 高级教程——数据可视化

    2023-12-25 11:38:01       30 阅读
  4. 有意思、好用的免费API分享

    2023-12-25 11:38:01       26 阅读
  5. ACE中为socket增加keepalive策略(windows和linux)

    2023-12-25 11:38:01       45 阅读
  6. ubuntu常用指令

    2023-12-25 11:38:01       33 阅读
  7. C语言例题6

    2023-12-25 11:38:01       32 阅读
  8. Android 10 实现随机分配 MAC 地址

    2023-12-25 11:38:01       35 阅读
  9. 150. 逆波兰表达式求值

    2023-12-25 11:38:01       36 阅读
  10. SQL语句分类

    2023-12-25 11:38:01       44 阅读