【大厂算法面试冲刺班】day2:合并两个有序链表

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

递归

class Solution {
   
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
   
        if (l1 == null) {
   
            return l2;
        }
        else if (l2 == null) {
   
            return l1;
        }
        else if (l1.val < l2.val) {
   
            l1.next = mergeTwoLists(l1.next, l2);
            return l1;
        }
        else {
   
            l2.next = mergeTwoLists(l1, l2.next);
            return l2;
        }

    }
}

根据以上规律考虑本题目:

终止条件:当两个链表都为空时,表示我们对链表已合并完成。
如何递归:我们判断 l1 和 l2 头结点哪个更小,然后较小结点的 next 指针指向其余结点的合并结果。(调用递归)

迭代

class Solution {
   
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
   
        ListNode prehead = new ListNode(-1);

        ListNode prev = prehead;
        while (l1 != null && l2 != null) {
   
            if (l1.val <= l2.val) {
   
                prev.next = l1;
                l1 = l1.next;
            } else {
   
                prev.next = l2;
                l2 = l2.next;
            }
            prev = prev.next;
        }

        // 合并后 l1 和 l2 最多只有一个还未被合并完,我们直接将链表末尾指向未合并完的链表即可
        prev.next = l1 == null ? l2 : l1;

        return prehead.next;
    }
}

迭代:
我们可以用迭代的方法来实现上述算法。当 l1 和 l2 都不是空链表时,判断 l1 和 l2 哪一个链表的头节点的值更小,将较小值的节点添加到结果里,当一个节点被添加到结果里之后,将对应链表中的节点向后移一位。

首先,我们设定一个哨兵节点 prehead ,这可以在最后让我们比较容易地返回合并后的链表。我们维护一个 prev 指针,我们需要做的是调整它的 next 指针。然后,我们重复以下过程,直到 l1 或者 l2 指向了 null :如果 l1 当前节点的值小于等于 l2 ,我们就把 l1 当前的节点接在 prev 节点的后面同时将 l1 指针往后移一位。否则,我们对 l2 做同样的操作。不管我们将哪一个元素接在了后面,我们都需要把 prev 向后移一位。

在循环终止的时候, l1 和 l2 至多有一个是非空的。由于输入的两个链表都是有序的,所以不管哪个链表是非空的,它包含的所有元素都比前面已经合并链表中的所有元素都要大。这意味着我们只需要简单地将非空链表接在合并链表的后面,并返回合并链表即可。

相关推荐

  1. 大厂算法面试冲刺day2合并有序

    2024-01-12 08:34:03       54 阅读
  2. Leetcode:合并有序

    2024-01-12 08:34:03       30 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-12 08:34:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-12 08:34:03       101 阅读
  3. 在Django里面运行非项目文件

    2024-01-12 08:34:03       82 阅读
  4. Python语言-面向对象

    2024-01-12 08:34:03       91 阅读

热门阅读

  1. 小明种苹果(UPC)

    2024-01-12 08:34:03       56 阅读
  2. Socket通讯使用的坑-消息合并发送-解决方法

    2024-01-12 08:34:03       61 阅读
  3. Flying HTML生成PDF添加水印

    2024-01-12 08:34:03       64 阅读
  4. js事件冒泡和默认事件是啥如何阻止

    2024-01-12 08:34:03       51 阅读
  5. com.fasterxml.jackson.databind.exc.InvalidFormatException异常

    2024-01-12 08:34:03       51 阅读
  6. Canvas 指南与总结

    2024-01-12 08:34:03       61 阅读
  7. Pytorch将标签转为One-Hot编码

    2024-01-12 08:34:03       49 阅读
  8. selenium无法定位元素问题

    2024-01-12 08:34:03       64 阅读
  9. 树莓派ubuntu:hdmi与wifi冲突问题

    2024-01-12 08:34:03       47 阅读
  10. 架构师常用的ChatGPT通用提示词模板

    2024-01-12 08:34:03       54 阅读