美文网首页转载部分AI学习
《每周一道算法题》(二)合并两个有序链表

《每周一道算法题》(二)合并两个有序链表

作者: 路飞_Luck | 来源:发表于2019-11-11 23:37 被阅读0次
    一 题目详解

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

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

    实例:

    输入:1->2->4, 1->3->4
    输出:1->1->2->3->4->4
    
    image.png
    二 思路分析
    思路一 迭代
    image.png
    思路二 递归
    • 第一次递归
    image.png
    • 第二次递归
    image.png
    • 第三次递归
    image.png
    • 第四次递归
    image.png
    • 第五次递归
    image.png
    三 代码实现
    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
    

    本文参考MJ老师的每周一道算法题,非常感谢MJ老师


    项目链接地址- 02_MergeTwoLists


    每周一道算法题 - 笔记


    相关文章

      网友评论

        本文标题:《每周一道算法题》(二)合并两个有序链表

        本文链接:https://www.haomeiwen.com/subject/npqybctx.html