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

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

题目概述(简单难度)

输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的

示例 1:

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


最后附上leetcode的链接

点击此处进行跳转


思路与代码

思路展现

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

假设这两个要合并的升序链表一个为4->12->78->79,一个为5->6->15->89->90->91,输出应该为4->5->6->12->15->78->79->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月前
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
49 0
|
2月前
|
存储 算法 安全
HashMap常见面试题(超全面):实现原理、扩容机制、链表何时升级为红黑树、死循环
HashMap常见面试题:红黑树、散列表,HashMap实现原理、扩容机制,HashMap的jd1.7与jdk1.8有什么区别,寻址算法、链表何时升级为红黑树、死循环
|
2月前
|
算法
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
32 0
|
4月前
|
存储 算法
LeetCode第83题删除排序链表中的重复元素
文章介绍了LeetCode第83题"删除排序链表中的重复元素"的解法,使用双指针技术在原链表上原地删除重复元素,提供了一种时间和空间效率都较高的解决方案。
LeetCode第83题删除排序链表中的重复元素
|
4月前
|
存储 算法 Python
【面试题】合井K个升序链表
【面试题】合井K个升序链表
35 0
|
4月前
|
存储 Java
【Java集合类面试十】、HashMap中的循环链表是如何产生的?
在多线程环境下,HashMap在扩容时如果发生条件竞争,元素的插入顺序可能形成循环链表,导致死循环。
|
4月前
|
存储 算法 Java
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
45 0
|
5月前
|
数据库
面试题ES问题之Elasticsearch的排序分页和高亮功能如何解决
面试题ES问题之Elasticsearch的排序分页和高亮功能如何解决
39 0
|
4月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
17天前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
下一篇
无影云桌面