IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 合并两个有序链表(递归/非递归) java -> 正文阅读

[数据结构与算法]合并两个有序链表(递归/非递归) java

目录

题目描述

题解一:非递归

题解二:递归


题目描述

题目地址:

https://leetcode-cn.com/problems/merge-two-sorted-lists/

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

示例一:

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

示例二:

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

示例三:

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

提示:

  • 两个链表的节点数目范围是?[0, 50]
  • -100 <= Node.val <= 100
  • l1?和?l2?均按?非递减顺序?排列

链表节点如以下代码所示:


 
  public class ListNode {
      int val;
      ListNode next;
      ListNode() {}
      ListNode(int val) { this.val = val; }
      ListNode(int val, ListNode next) { this.val = val; this.next = next; }
  }
 

题解一:非递归

一开始没仔细读题,就想着再创建一个链表装这两个链表,看了题解之后发现很简单,只需要一个额外的节点就行了,如图:

测试用例一:1 2 4

? ? ? ? ? ? ? ? ? ? ? 1 3 4

讲解

已经是有序的两个链表,,在原空间的基础上升序它俩,可以使用归并排序的思路:

class Solution {
    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
            ListNode pre = new ListNode(-1);
            ListNode p = pre;
           
            while (list1 != null && list2 != null){
                if (list1.val <= list2.val) {
                    p.next = list1;
                    list1 = list1.next;
                } else {
                    p.next = list2;
                    list2 = list2.next;
                }
                p = p.next;
            }
            if (list1 == null) p.next = list2;
            if (list2 == null) p.next = list1;
            return pre.next; 
    }
}

(为什么用两个指针指向额外的节点呢?p是作为针,连接list1和list2这两条链表的,它到最后肯定要指向list1或者list2其中一条链表的尾部的,那么pre就用来返回。)

如图,list1的第一个元素为1,list2中的第一个元素也为1,将额外的节点指向list1的第一个节点,然后将list1指针向后移动一位,同样,p也要跟着移动,因为它还要连接list2中的数据:

p.next = list1;
list1 = list1.next;
p = p.next; // p的next已经指向list1,所以这一步可以将p移动到之前list1所在的位置

?list1和list2的元素继续比较,发现list1是2,list2是1,那么将p指向list2,list2向后移一位,同样,p也要后移一位

p.next = list2;
list2 = list2.next;
p = p.next;

?list1中的2小于list2中的3,就把p指向list1,list1向后移一位,同样,p也要后移一位

??list2中的3小于list1中的4,就把p指向list2,list2向后移一位,同样,p也要后移一位

list1和list2中最后一位相等,将p指向list1,此时?将list1向后移动一位,list1指向空,代表已经没有下一次循环了

此时循环已经结束了,可是list2还剩一个孤儿没有被串起来,就要用if else 判断一下

如果list1指向为空,就代表list1已经串完了,将p.next指向list2即可

同理,如果list2指向为空,?就代表list2已经串完了,将p.next指向list1即可:

这时,把pre连接的链表伸直就是这样:

由于pre这个节点只是辅助作用,所以返回值是? pre.next?

这时你会不会有疑问,那list2剩下的元素怎么办呢?没有把他们穿起来啊,

因为这是链表,后面的元素本来就跟list2连着,把p指向list2相当于把后面的元素一起串起来了。

题解二:递归

递归过程只可意会不可言传...

class Solution {
    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
       
        if (list1 == null) return list2;
        if (list2 == null) return list1;
        if (list1.val <= list2.val) {
            list1.next = mergeTwoLists(list1.next,list2);
            return list1;
        } else {
            list2.next = mergeTwoLists(list1,list2.next);
            return list2;
        }
    }
}

言传如图:

(这张图在电脑上可以看)

(这些图在手机上看)

示例:

?

?

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-07 22:56:50  更:2022-04-07 22:57:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 9:53:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码