合并两个排序的链表(剑指offer 25)Java

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

一、题目描述



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


示例1:

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

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


限制:

0 <= 链表长度 <= 1000


二、思路讲解



两个指针分别从两个链表的头出发, 哪个节点的值小,就把他加到公共节点的后面。等某一个链表遍历完之后,就把没遍历完的链表直接放到公共链表的后面。


由于题目中并没有给出公共链表的头结点,我们可以随意申请一个节点head,将他作为公共链表的头,操作完成后直接返回head.next即可。


三、Java代码实现



/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        ListNode head = new ListNode(0);    //申请头结点
        ListNode p = head;  //指针,初始化指向公共链表头结点
        //一旦有一个链表为空,跳出
        while(l1!=null && l2!=null){
            if(l1.val <= l2.val){
                //保存l1的后面部分
                ListNode next = l1.next;
                p.next = l1;
                p.next.next = null;
                p = p.next;
                l1 = next;
            } else {
                ListNode next = l2.next;
                p.next = l2;
                p.next.next = null;
                p = p.next;
                l2 = next;
            }
        }
        //将剩余部分加到公共指针后面
        if(l1!=null){
            p.next = l1;
        }
        if(l2!=null){
            p.next = l2;
        }
        return head.next;
    }
}



四、时空复杂度分析


     

时间复杂度:        O(M+N)        需要遍历两个链表

     

空间复杂度:        O(1)             只额外申请了一个头结点和一个指针

相关文章
|
4月前
|
Java
java数据结构,双向链表的实现
文章介绍了双向链表的实现,包括数据结构定义、插入和删除操作的代码实现,以及双向链表的其他操作方法,并提供了完整的Java代码实现。
java数据结构,双向链表的实现
|
3月前
|
存储 安全 Java
【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro
【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro
30 3
|
3月前
|
存储 搜索推荐 算法
【用Java学习数据结构系列】七大排序要悄咪咪的学(直接插入,希尔,归并,选择,堆排,冒泡,快排)以及计数排序(非比较排序)
【用Java学习数据结构系列】七大排序要悄咪咪的学(直接插入,希尔,归并,选择,堆排,冒泡,快排)以及计数排序(非比较排序)
34 1
|
3月前
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
56 0
|
3月前
|
算法
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
❤️算法笔记❤️-(每日一刷-83、删除排序链表中的重复项)
36 0
|
5月前
|
存储 Java
Java中ArrayList 元素的排序
本文提供了Java中根据`ArrayList`元素的某个属性进行排序的示例代码,包括实现`Comparable`接口和重载`compareTo`方法,然后使用`Collections.sort`方法进行排序。
|
5月前
|
存储 Java
|
5月前
|
存储 Java 开发者
揭秘!HashMap底层结构大起底:从数组到链表,再到红黑树,Java性能优化的秘密武器!
【8月更文挑战第24天】HashMap是Java集合框架中的核心组件,以其高效的键值对存储和快速访问能力广受开发者欢迎。在JDK 1.8及以后版本中,HashMap采用了数组+链表+红黑树的混合结构,实现了高性能的同时解决了哈希冲突问题。数组作为基石确保了快速定位;链表则用于处理哈希冲突;而当链表长度达到一定阈值时,通过转换为红黑树进一步提升性能。此外,HashMap还具备动态扩容机制,当负载因子超过预设值时自动扩大容量并重新哈希,确保整体性能。通过对HashMap底层结构的深入了解,我们可以更好地利用其优势解决实际开发中的问题。
133 0
|
5月前
|
存储 Java
|
5月前
|
存储 搜索推荐 Java