这是悦乐书的第148次更新,第150篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第7题(顺位题号是21)。合并两个已排序的链表并将其作为新链表返回。 新链表应该通过拼接前两个链表的节点来完成。例如:

链表L1包含三个节点,为1,2,4

链表L2包含三个节点,为1,3,4

将L1和L2合并后的新链表包含6个节点,为1,1,2,3,4,4

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 此题中的链表是什么?

先来看段代码,下面是定义的ListNode类,有两个属性,一个是存储整数值的val,一个是ListNode类本身的next,存储下一个ListNode的地址值(指针)。形象的解释就是,链表可以是拉链的齿轮,互相咬合;也可以是电影《盗梦空间》中的梦中梦;就像大盒子里面可以继续放盒子一样。

class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}

为了更好的理解链表是怎么存储值的,且看下面的代码。l1的next属性引用了l2,l2的next属性引用了l3。

public class Easy_21_MergeTwoSortedList {

	public static void main(String[] args) {
Easy_21_MergeTwoSortedList instance = new Easy_21_MergeTwoSortedList();
ListNode l1 = new ListNode(1);
ListNode l2 =new ListNode(2);
ListNode l3 =new ListNode(4);
l1.next = l2;
l2.next = l3;
System.out.println(instance.listNodeToString(l1));
ListNode l4 = new ListNode(1);
ListNode l5 =new ListNode(3);
ListNode l6 =new ListNode(4);
l4.next = l5;
l5.next = l6;
System.out.println(instance.listNodeToString(l4));
} public String listNodeToString(ListNode L){
List<Integer> list = new ArrayList<Integer>();
while(L != null){
list.add(L.val);
L = L.next;
}
return list.toString();
}
}

03 第一种解法

因为给的链表都是已经排过序的(由小到大),只需要依次比较两个链表的元素val值即可,并且存入一个新的链表里面。如果某一个链表先循环完,新链表剩下的元素就是另外一个链表剩下的元素。

public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode dummy = new ListNode(-1);
ListNode cur = dummy;
while (l1 != null && l2 != null) {
if (l1.val < l2.val) {
cur.next = l1;
l1 = l1.next;
} else {
cur.next = l2;
l2 = l2.next;
}
cur = cur.next;
}
cur.next = (l1 != null) ? l1 : l2;
return dummy.next;
}

04 第二种解法

像第二种方法循环判断再取值的情况,很容易联想到递归,即自己调用自己,同时给予退出条件即可。使用递归的好处就是代码量少。

public ListNode mergeTwoLists2(ListNode l1, ListNode l2) {
if (l1 == null) {
return l2;
}
if (l2 == null) {
return l1;
}
if (l1.val < l2.val) {
l1.next = mergeTwoLists2(l1.next, l2);
return l1;
} else {
l2.next = mergeTwoLists2(l1, l2.next);
return l2;
}
}

05 小结

此题虽然不难,但是需要先将题目意思读懂,并且知道链表是怎么存数据的,这样才能更好解题。为了更好理解,下面贴上全部代码。

package leetcode;

import java.util.ArrayList;
import java.util.List; /**
* 合并两个已排序的链接列表并将其作为新列表返回。 新列表应该通过拼接前两个列表的节点来完成。
* 例:
* 输入:1-> 2-> 4, 1-> 3-> 4
* 输出:1-> 1-> 2-> 3-> 4-> 4
* @author 小川94
* @date 2018-10-21
*/
public class Easy_21_MergeTwoSortedList { public static void main(String[] args) {
Easy_21_MergeTwoSortedList instance = new Easy_21_MergeTwoSortedList();
ListNode l1 = new ListNode(1);
ListNode l2 =new ListNode(2);
ListNode l3 =new ListNode(4);
l1.next = l2;
l2.next = l3;
System.out.println(instance.listNodeToString(l1));
ListNode l4 = new ListNode(1);
ListNode l5 =new ListNode(3);
ListNode l6 =new ListNode(4);
l4.next = l5;
l5.next = l6;
System.out.println(instance.listNodeToString(l4));
ListNode result = instance.mergeTwoLists2(l1, l4);
System.out.println(instance.listNodeToString(result));
} public String listNodeToString(ListNode L){
List<Integer> list = new ArrayList<Integer>();
while(L != null){
list.add(L.val);
L = L.next;
}
return list.toString();
} /**
* 顺位循环判断
* @param l1
* @param l2
* @return
*/
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode dummy = new ListNode(-1);
ListNode cur = dummy;
while (l1 != null && l2 != null) {
if (l1.val < l2.val) {
cur.next = l1;
l1 = l1.next;
} else {
cur.next = l2;
l2 = l2.next;
}
cur = cur.next;
}
cur.next = (l1 != null) ? l1 : l2;
return dummy.next;
} /**
* 利用递归
* @param l1
* @param l2
* @return
*/
public ListNode mergeTwoLists2(ListNode l1, ListNode l2) {
if (l1 == null) {
return l2;
}
if (l2 == null) {
return l1;
}
if (l1.val < l2.val) {
l1.next = mergeTwoLists2(l1.next, l2);
return l1;
} else {
l2.next = mergeTwoLists2(l1, l2.next);
return l2;
}
} } class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}

此题解法远不止上面这两种,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

【算法】LeetCode算法题-Merge Two Sorted List的更多相关文章

  1. 乘风破浪:LeetCode真题_023_Merge k Sorted Lists

    乘风破浪:LeetCode真题_023_Merge k Sorted Lists 一.前言 上次我们学过了合并两个链表,这次我们要合并N个链表要怎么做呢,最先想到的就是转换成2个链表合并的问题,然后解 ...

  2. 乘风破浪:LeetCode真题_021_Merge Two Sorted Lists

    乘风破浪:LeetCode真题_021_Merge Two Sorted Lists 一.前言 关于链表的合并操作我们是非常熟悉的了,下面我们再温故一下将两个有序链表合并成一个的过程,这是基本功. 二 ...

  3. leetcode第22题--Merge k Sorted Lists

    problem:Merge k sorted linked lists and return it as one sorted list. Analyze and describe its compl ...

  4. 【LeetCode练习题】Merge k Sorted Lists

    Merge k Sorted Lists Merge k sorted linked lists and return it as one sorted list. Analyze and descr ...

  5. [Leetcode][Python]23: Merge k Sorted Lists

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 23: Merge k Sorted Listshttps://oj.leet ...

  6. 【一天一道LeetCode】#23. Merge k Sorted Lists

    一天一道LeetCode系列 (一)题目 Merge k sorted linked lists and return it as one sorted list. Analyze and descr ...

  7. 【一天一道LeetCode】#21. Merge Two Sorted Lists

    一天一道LeetCode系列 (一)题目 Merge two sorted linked lists and return it as a new list. The new list should ...

  8. 【LeetCode】21. Merge Two Sorted Lists 合并两个有序链表

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人公众号:负雪明烛 本文关键词:合并,有序链表,递归,迭代,题解,leetcode, 力 ...

  9. 【LeetCode】23. Merge k Sorted Lists 合并K个升序链表

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人公众号:负雪明烛 本文关键词:合并,链表,单链表,题解,leetcode, 力扣,Py ...

随机推荐

  1. sql server 获取自增列下一个值或者获取指定表的主键值

    IDENT_CURRENT('TableName')为当前的最大标识值, IDENT_INCR('TableName')为设置的标识值增量, 两者相加即为下一个标识值 如: SELECT IDENT_ ...

  2. 对象引用对于非静态的字段、方法、属性Program.Print()是必需的

    在学习重载是以下代码报错: using System; using System.Collections.Generic; using System.Linq; using System.Text; ...

  3. 在CentOS中部署.Net Core2.1网站

    作为一个刚接触linux的新手,在安装环境的时候,折腾了不少时间,写下一篇总结帖,帮助下新人吧~ 做完后再回来看步骤,也很简单,也就以下几步: 1.安装.Net Core环境 2.安装nginx实现端 ...

  4. 水晶报表Crystal 无效索引

    这几天项目用到水晶报表做报表打印,没有前辈指导,都自己摸着石头过河,真是痛并快乐着.其实水晶报表还是挺好用的,对初学者也并不难(我就是初学者).昨天遇到一个问题:无效索引 ……开始以为是报表设置的问题 ...

  5. 阿里云redis映射到阿里云服务器

    参考文档:https://help.aliyun.com/document_detail/43850.html?spm=a2c4g.11186623.2.3.7yg9VH ECS Windows 篇 ...

  6. VS2017 启动调试出现 无法启动程序“http://localhost:15613” 操作在当前状态中是非法的。 同时附加进程也是错误的解决方法

    第一次发表这样的博客,不会如何的排版,还有很多的不懂,大神勿喷哈! 同时是给自己做的一次记录,已方便后面可能会同样出现该问题后不用像无头苍蝇一样到处百度乱找 VS2017 启动调试出现  无法启动程序 ...

  7. [leetcode](4.21)3. 最长重复子串

    给定字符串 S,找出最长重复子串的长度.如果不存在重复子串就返回 0. 示例 1: 输入:"abcd" 输出:0 解释:没有重复子串. 示例 2: 输入:"abbaba& ...

  8. Maven(八)Eclipse创建Web项目(复杂方式)

    1. 生成标准的Web工程结构 2. 勾选结尾为webapp的包 3. 生成的文件结构如下 3.1 生成的目录结构若存在错误,缺少servlet.api 3.1.1 添加步骤如下 4.生成后存在的缺点 ...

  9. 在Java中进行序列化和反序列化

    对象序列化的目标是将对象保存在磁盘中,或者允许在网络中直接传输对象. 对象序列化允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久保存在磁盘上或者通过网络将这种二进制流传输 ...

  10. 发生服务器错误: Error loading MySQLdb module: libmysqlclient.so.18: cannot open shared object file: No such file or directory

    在hue上配置Mysql的时候,出现的错误:  发生服务器错误: Error loading MySQLdb module: libmysqlclient.so.18: cannot open sha ...