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

题目概述(简单难度)

两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:
在这里插入图片描述

输入: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
在这里插入图片描述
在这里插入图片描述
然后定义一个新的链表来存储合并过后的链表,这个新链表的头节点我们设置为l3,后期合并的链表全部采用后插法插入到l3这个头节点的后面.
同时我们还要设置一个指针tmp用于保存我们每次插入的节点,这样做的意义是方便下次插入节点的时候能够找到要插入的节点的前驱一开始我们的tmp指针是指向我们的新链表的头节点l3的。
在这里插入图片描述
下面就到了我们插入的核心代码了,一开始头指针l1l2分别指向我们的两个升序链表的头节点,那么首先我们来判断这两个指针所指向的节点的值域的大小(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的链接点击题解去看其他人的解法.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值