阅读 255

力扣第二十一题-合并两个有序链表

这是我参与更文挑战的第18天,活动详情查看: 更文挑战

前言

力扣第二十一题 合并两个有序链表 如下所示:

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

示例1

image.png

输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]

示例 2

输入:l1 = [], l2 = []
输出:[]

示例 3

输入:l1 = [], l2 = [0]
输出:[0]

一、思路

既然是合并两个升序链表,就可以很自然的想到使用迭代来进行合并了。大致的实现思路就是在遍历链表L1的过程中,将L1和L2链表中更小的值插入到新的链表中。如果L1遍历结束后L2不为空,则将L2的整个插入新链表。

来看一下具体的步骤吧,此处以示例1中的 l1 = [1,2,4], l2 = [1,3,4] 作为例子。

hear1:指向链表 L1 的头部
head2:指向链表 L2 的头部
插入新队列的原则:如 L1 中的元素小则加入链表,否则选择 L2 中的元素

图解

初始状态如下所示:

image.png

L1 的第一个元素 1 不小于 L2 中的元素 1则选择 L2 中的元素,head2 向后移动一位。如下图所示:

image.png

L1 后面的元素 12 均小于 L2 中的元素 3,故 L1 中的 2 和 3 加入新链表。如下图所示:

image.png

L1 后面的元素 4 不小于 L2 中的 34,故 L2 中的 3 和 4 加入新链表。如下图所示:

image.png

最后 L1最后一个元素 4 加入新链表。如下图所示:

image.png

相信通过上面的步骤解析,很清晰的就能知道如何通过迭代来合并有序链表了!

二、实现

代码实现

变量解释:
ret:结果集
temp:临时变量
tips:需要防止 L1 遍历完但 L2 还有元素和 L1 还没遍历完 L2 就没有元素了

    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        ListNode ret = new ListNode();
        ListNode temp = ret;
        // 迭代
        while (l1 != null && l2 != null) {
            if (l1.val < l2.val) {
                temp.next = new ListNode(l1.val);
                l1 = l1.next;
            } else {
                temp.next = new ListNode(l2.val);
                l2 = l2.next;
            }
            temp = temp.next;
        }
        // 将未遍历完的列表归入结果
        if (l1 == null) {
            temp.next = l2;
        }
        if (l2 == null)
            temp.next = l1;
        return ret.next;
    }
复制代码

测试代码

    public static void main(String[] args) {
        ListNode l1 = new ListNode(1, new ListNode(2, new ListNode(4)));
        ListNode l2 = new ListNode(1, new ListNode(3, new ListNode(4)));
        new Number21().mergeTwoLists(l1, l2);
    }
复制代码

结果

image.png

三、总结

感谢看到最后,非常荣幸能够帮助到你~♥

文章分类
前端
文章标签