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

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

题目概述(简单难度)

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

示例 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的链接点击题解去看其他人的解法.


相关文章
|
2月前
|
Python
【Leetcode刷题Python】21. 合并两个有序链表
介绍了几种不同的方法来合并多个已排序的链表,包括暴力求解、使用小顶堆以及分而治之策略。
35 2
|
4月前
|
存储 算法 C语言
【数据结构与算法 刷题系列】合并两个有序链表
【数据结构与算法 刷题系列】合并两个有序链表
|
2月前
|
算法
LeetCode第21题合并两个有序链表
该文章介绍了 LeetCode 第 21 题合并两个有序链表的解法,通过创建新链表,依次比较两个链表的头节点值,将较小的值插入新链表,直至其中一个链表遍历完,再将另一个链表剩余部分接到新链表后面,实现合并。
LeetCode第21题合并两个有序链表
|
2月前
|
算法
【算法】合并两个有序链表(easy)——递归算法
【算法】合并两个有序链表(easy)——递归算法
【算法】合并两个有序链表(easy)——递归算法
|
3月前
【数据结构OJ题】合并两个有序链表
力扣题目——合并两个有序链表
36 8
【数据结构OJ题】合并两个有序链表
|
3月前
|
Java
力扣经典150题第五十八题:合并两个有序链表
力扣经典150题第五十八题:合并两个有序链表
34 2
|
4月前
|
算法 Java
[Java·算法·中等] LeetCode21. 合并两个有序链表
[Java·算法·中等] LeetCode21. 合并两个有序链表
39 2
|
4月前
21. 合并两个有序链表
21. 合并两个有序链表
|
3月前
链表6(法二好理解)------ 7-6 sdut-C语言实验-有序链表的归并分数 20
链表6(法二好理解)------ 7-6 sdut-C语言实验-有序链表的归并分数 20
17 0
|
3月前
sdut 链表6-------7-6 sdut-C语言实验-有序链表的归并
sdut 链表6-------7-6 sdut-C语言实验-有序链表的归并
16 0