iOS算法题(二)合并两个有序链表

一 题目详解

https://leetcode-cn.com/problems/merge-two-sorted-lists/

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

实例:

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

image

二 思路分析
思路一 迭代

image

思路二 递归

作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS交流群:413038000,不管你是大牛还是小白都欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长!

以下资料在群文件可自行下载!

  • 第一次递归

image

  • 第二次递归

image

  • 第三次递归

image

  • 第四次递归

image

  • 第五次递归

image

三 代码实现
3.1 迭代实现
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    // 构造两个链表
    LinkNode *k3 = [[LinkNode alloc] initWithElement:@(5) next:nil];
    LinkNode *k2 = [[LinkNode alloc] initWithElement:@(3) next:k3];
    LinkNode *k1 = [[LinkNode alloc] initWithElement:@(1) next:k2];

    LinkNode *k5 = [[LinkNode alloc] initWithElement:@(4) next:nil];
    LinkNode *k4 = [[LinkNode alloc] initWithElement:@(2) next:k5];

    // 方法一
    LinkNode *k = [self mergeTwoLists2:k1 k2:k4];
    while (k) {
        NSLog(@"%@",[k description]);
        k = k.next;
    }
}

/// 方法一:合并2个有序链表
- (LinkNode *)mergeTwoLists2:(LinkNode *)k1 k2:(LinkNode *)k2 {
    if (k1 == nil) return k2;
    if (k2 == nil) return k1;

    // 虚拟头结点(dummy head)
    LinkNode *head = [[LinkNode alloc] init];
    LinkNode *cur = head;

    while (k1 != nil && k2 != nil) {
        if (k1.value <= k2.value) {
            cur = cur.next = k1;
            k1 = k1.next;
        } else {
            cur = cur.next = k2;
            k2 = k2.next;
        }
    }

    if (k1 == nil) {
        cur.next = k2;
    } else if (k2 == nil) {
        cur.next = k1;
    }

    return head.next;
}

  • 运行结果
2019-11-11 23:20:13.400891+0800 02_MergeTwoLists[25866:963864] null_1_2
2019-11-11 23:20:13.401120+0800 02_MergeTwoLists[25866:963864] null_2_3
2019-11-11 23:20:13.401257+0800 02_MergeTwoLists[25866:963864] null_3_4
2019-11-11 23:20:13.401382+0800 02_MergeTwoLists[25866:963864] null_4_5
2019-11-11 23:20:13.401481+0800 02_MergeTwoLists[25866:963864] null_5_null

3.2 递归实现
/// 方法一:递归
/// 1.只要是用到递归,首先要搞清楚一个问题,这个递归函数的功能是什么
/// 2.递归基:边界
- (LinkNode *)mergeTwoLists:(LinkNode *)k1 k2:(LinkNode *)k2 {
    if (k1 == nil) return k2;
    if (k2 == nil) return k1;

    if (k1.value <= k2.value) {
        k1.next = [self mergeTwoLists:k1.next k2:k2];
        return k1;
    } else {
        k2.next = [self mergeTwoLists:k1 k2:k2.next];
        return k2;
    }
}

  • 运行结果
2019-11-11 23:26:42.654185+0800 02_MergeTwoLists[26034:968649] null_1_2
2019-11-11 23:26:42.654375+0800 02_MergeTwoLists[26034:968649] null_2_3
2019-11-11 23:26:42.654482+0800 02_MergeTwoLists[26034:968649] null_3_4
2019-11-11 23:26:42.654593+0800 02_MergeTwoLists[26034:968649] null_4_5
2019-11-11 23:26:42.654691+0800 02_MergeTwoLists[26034:968649] null_5_null



项目链接地址- 02_MergeTwoLists

作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS交流群:413038000,不管你是大牛还是小白都欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长!

推荐阅读
iOS开发——最新 BAT面试题合集(持续更新中)

作者:路飞_Luck
链接:https://www.jianshu.com/p/2ee701ea839b
来源:简书

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值