合并两个有序链表(面试常考,非常重要)

简介: 合并两个有序链表(面试常考,非常重要)

题目概述(简单难度)

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

示例 1:

2.png


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

示例 2:

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


示例 3:


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

最后附上leetcode的链接

点击此处进行跳转


思路与代码

思路展现

我们首先来审题,前提是两个升序的链表合并成为一个新的升序链表

假设这两个要合并的升序链表一个为[4,12,78,79],一个为[5,6,15,89,90,91]

那么此时我们可以定义一个新的链表来存储这个新的升序链表.

先给我们两个升序的链表定义两个新的头指针l1,l2

2.png2.png


然后定义一个新的链表来存储合并过后的链表,这个新链表的头节点我们设置为l3,后期合并的链表全部采用后插法插入到l3这个头节点的后面.

同时我们还要设置一个指针tmp用于保存我们每次插入的节点,这样做的意义是方便下次插入节点的时候能够找到要插入的节点的前驱,一开始我们的tmp指针是指向我们的新链表的头节点l3的。

2.png

下面就到了我们插入的核心代码了,一开始头指针l1和l2分别指向我们的两个升序链表的头节点,那么首先我们来判断这两个指针所指向的节点的值域的大小(val代表链表的节点的值域,next代表指针域).

如果l1.val>l2.val,那么就将l2这个节点插入到我们新链表头节点l3的后面,即执行tmp.next=l2语句,然后此时l2指针移动到下一个节点,执行l2=l2.next语句,我们的tmp指针此时也需要保存新插入的节点,所以执行tmp=tmp.next语句,下次再进行插入的时候就直接插入到tmp保存的新节点的后面.

如果l1.val<l2.val,那么就将l1这个节点插入到我们新链表头节点l3的后面,即执行tmp.next=l1语句,然后此时l1指针移动到下一个节点,执行l1=l1.next语句,我们的tmp指针此时也需要保存新插入的节点,所以执行tmp=tmp.next语句,下次再进行插入的时候就直接插入到tmp保存的新节点的后面.

如此往复即可

当然我们还要对特殊情况进行判断:

(1)假如此时我们的两个链表一个为空,一个不为空

当l1不为空的时候,说明l2为空,那么就直接将头指针l1对应的链表插入到新链表的头节点后面,即执行tmp.next=l1语句即可.

当l2不为空的时候,说明l1为空,那么就直接将头指针l2对应的链表插入到新链表的头节点后面,即执行tmp.next=l2语句即可.

(2)假如都为空,就直接返回l3.next,即返回一个空链表.同时也要注意我们最后合并成功后返回的节点也是我们l3.next,即为我们插入的第一个节点,这个也需要注意下.


代码示例

class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        ListNode l3=new ListNode(-1);
        ListNode tmp=l3;
        while((l1!=null)&&(l2!=null)){
           if(l1.val>l2.val){
               tmp.next=l2;
               l2=l2.next;
           }else{
               tmp.next=l1;
               l1=l1.next;
           }
           tmp=tmp.next;
        }
        //代码走到这里肯定是一个为空,一个不为空
        if(l1!=null){
            tmp.next=l1;
        }
        if(l2!=null){
            tmp.next=l2;
        }
        return l3.next;
    }
}

总结

这道题目总的来说是比较简单的,需要定义的变量比较多,当然解法也不止这一种,大家下来如果希望了解其他解法的话可以去上面的leetcode的链接点击题解去看其他人的解法.


相关文章
Leetcode第21题(合并两个有序链表)
这篇文章介绍了如何使用非递归和递归方法解决LeetCode第21题,即合并两个有序链表的问题。
184 0
Leetcode第21题(合并两个有序链表)
|
5月前
|
机器学习/深度学习 算法
24. 两两交换链表中的节点, 19.删除链表的倒数第N个节点 ,面试题 02.07. 链表相交
1. **两两交换链表中的节点**:通过引入虚拟头结点,使所有节点都能采用统一的交换逻辑,避免对头结点单独处理。 2. **删除链表的倒数第N个节点**:利用双指针技巧,让快慢指针保持N个节点的距离,当快指针到达末尾时,慢指针正好指向待删除节点的前一个节点。 3. **链表相交**:先计算两链表长度并调整起点,确保从相同距离末尾的位置开始遍历,从而高效找到相交节点或确定无交点。 以上方法均在时间复杂度和空间复杂度上进行了优化,适合用于理解和掌握链表的基本操作及常见算法设计思路。
|
存储 算法
【❤️算法笔记❤️】-每日一刷-21、合并两个有序链表
【❤️算法笔记❤️】-每日一刷-21、合并两个有序链表
305 0
|
Python
【Leetcode刷题Python】21. 合并两个有序链表
介绍了几种不同的方法来合并多个已排序的链表,包括暴力求解、使用小顶堆以及分而治之策略。
174 2
|
存储 算法 C语言
【数据结构与算法 刷题系列】合并两个有序链表
【数据结构与算法 刷题系列】合并两个有序链表
|
11月前
|
存储 缓存 安全
只会“有序无序”?面试官嫌弃的List、Set、Map回答!
小米,一位热衷于技术分享的程序员,通过与朋友小林的对话,详细解析了Java面试中常见的List、Set、Map三者之间的区别,不仅涵盖了它们的基本特性,还深入探讨了各自的实现原理及应用场景,帮助面试者更好地准备相关问题。
283 20
【数据结构OJ题】合并两个有序链表
力扣题目——合并两个有序链表
142 8
【数据结构OJ题】合并两个有序链表
LeetCode第21题合并两个有序链表
该文章介绍了 LeetCode 第 21 题合并两个有序链表的解法,通过创建新链表,依次比较两个链表的头节点值,将较小的值插入新链表,直至其中一个链表遍历完,再将另一个链表剩余部分接到新链表后面,实现合并。
LeetCode第21题合并两个有序链表
|
算法
【算法】合并两个有序链表(easy)——递归算法
【算法】合并两个有序链表(easy)——递归算法
126 0
【算法】合并两个有序链表(easy)——递归算法
|
设计模式 安全 Java
Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
193 1
下一篇
oss云网关配置