LeetCode 解题报告-21.合并两个有序链表

今天做 LeetCode 21. 合并两个有序链表,题目难度为 Easy

一. 题目要求

给定两个有序链表,合并成一个有序链表。

例子

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

二. 解题思路 & 代码

要将两个链表合并,遍历操作是肯定需要的,同时链表必须是有序链表,因此在遍历的过程中需要进行值的判断,以确定新链表中各个 Node 的顺序。

解题思路

  • 1.比较 l1、l2 的头节点,将较小的节点作为合并后链表的头节点,合并完成后返回。
  • 2.遍历两个链表,每次遍历进行比较,取较小的节点作为新链表的节点,其余的继续遍历,直到出现节点为空时,遍历结束。
  • 3.判断 l1、l2 是否有不为空的情况,如果不为空,则将其添加到新链表的尾部。

具体实现代码如下:


 class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {

        if (Objects.isNull(l1)) {
            return l2;
        }

        if (Objects.isNull(l2)) {
            return l1;
        }

        // 1. 选择头节点
        ListNode head;
        if (l1.val <= l2.val) {
            head = l1;
        }else {
            head = l2;
        }

        // 2. 遍历 

        // 新链表的尾节点
        ListNode tailNode = head;
        while (l1 != null && l2 != null) {

            if (l1.val <= l2.val) {
                // 选择较小的节点,在进行链表变动之前必须先记录下其 next 节点
                ListNode next = l1.next;
                tailNode.next = l1;
                l1 = next;

            }else {
                ListNode next = l2.next;
                tailNode.next = l2;
                l2 = next;
            }
            tailNode = tailNode.next;
        }

        // 3. 如果有还没有遍历的部分,将其加入到新链表尾部。
        if (Objects.isNull(l1)) {
            tailNode.next = l2;
        }else {
            tailNode.next = l1;
        }
        return head;
    }
}

代码运行结果为:

  • Runtime: 0 ms, faster than 100.00%
  • Memory Usage: 39 MB, less than 19.53%

三. 解题后记

题目相对比较简单,关键还是要把遍历过程中如何比较、取节点想清楚。另外就是不要忘了两个链表的长度可能是不能的,一个遍历完了另一个可能还有未遍历的部分,要记得将这部分添加到新链表的尾部。

我是 AhriJ邹同学,前后端、小程序、DevOps 都搞的炸栈工程师。博客持续更新,欢迎小伙伴关注或与我私信交流,互相学习,共同进步。

你可能感兴趣的:(LeetCode,算法)