【算法】LeetCode算法题-Merge Two Sorted List
这是悦乐书的第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的更多相关文章
- 乘风破浪:LeetCode真题_023_Merge k Sorted Lists
乘风破浪:LeetCode真题_023_Merge k Sorted Lists 一.前言 上次我们学过了合并两个链表,这次我们要合并N个链表要怎么做呢,最先想到的就是转换成2个链表合并的问题,然后解 ...
- 乘风破浪:LeetCode真题_021_Merge Two Sorted Lists
乘风破浪:LeetCode真题_021_Merge Two Sorted Lists 一.前言 关于链表的合并操作我们是非常熟悉的了,下面我们再温故一下将两个有序链表合并成一个的过程,这是基本功. 二 ...
- leetcode第22题--Merge k Sorted Lists
problem:Merge k sorted linked lists and return it as one sorted list. Analyze and describe its compl ...
- 【LeetCode练习题】Merge k Sorted Lists
Merge k Sorted Lists Merge k sorted linked lists and return it as one sorted list. Analyze and descr ...
- [Leetcode][Python]23: Merge k Sorted Lists
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 23: Merge k Sorted Listshttps://oj.leet ...
- 【一天一道LeetCode】#23. Merge k Sorted Lists
一天一道LeetCode系列 (一)题目 Merge k sorted linked lists and return it as one sorted list. Analyze and descr ...
- 【一天一道LeetCode】#21. Merge Two Sorted Lists
一天一道LeetCode系列 (一)题目 Merge two sorted linked lists and return it as a new list. The new list should ...
- 【LeetCode】21. Merge Two Sorted Lists 合并两个有序链表
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人公众号:负雪明烛 本文关键词:合并,有序链表,递归,迭代,题解,leetcode, 力 ...
- 【LeetCode】23. Merge k Sorted Lists 合并K个升序链表
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人公众号:负雪明烛 本文关键词:合并,链表,单链表,题解,leetcode, 力扣,Py ...
随机推荐
- 聊聊数据库~2.SQL环境篇
传统数据库 上篇文章:聊聊数据库~开篇 https://www.cnblogs.com/dotnetcrazy/p/9690466.html 本来准备直接开讲NoSQL的(当时开篇就是说的NoSQL) ...
- GVRP 的工作机制和工作模式
GVRP 简介 GVRP 基于 GARP 的工作机制来维护设备中的 VLAN 动态注册信息,并将该信息向其他设备传播:当设备启动了 GVRP 之后,就能够接收来自其他设备的 VLAN 注册信息,并动态 ...
- springBoot系列-->springBoot注解大全
一.注解(annotations)列表 @SpringBootApplication:包含了@ComponentScan.@Configuration和@EnableAutoConfiguration ...
- HBase的java客户端测试(一)---DDL操作
测试准备 [首先同步时间:] for node in CloudDeskTop master01 master02 slave01 slave02 slave03;do ssh $node " ...
- spark之JDBC开发(连接数据库测试)
spark之JDBC开发(连接数据库测试) 以下操作属于本地模式操作: 1.在Eclipse4.5中建立工程RDDToJDBC,并创建一个文件夹lib用于放置第三方驱动包 [hadoop@CloudD ...
- 各个模式的accesstoken续期详解
一些预备知识 jwt的时间格式 转换为时间可以用js, new Date(1531841745*1000) ==>Tue Jul 17 2018 23:35:45 GMT+0800 (中国标准时 ...
- 【译】《Clean C#》
本文是<Clean C#>一书译文的序言,阅读译文请移步至:<Clean C#>译文. <Clean C#>的副标题是Readable,Maintainable,P ...
- Echarts3.0 引入百度地图(转载)
转载来源: https://blog.csdn.net/yc_1993/article/details/52431989 Echarts3.0引入百度地图 update: 由于目前echarts3.8 ...
- php的TS和NTS的区别
ts(Thread-Safety)即线程安全,多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他 线程不能进行访问直到该线程读取完,其他线程才可使用.不会出现数据不一致或者数 ...
- nodeJs express mongodb 建站(mac 版)
基本环境 homebrew.node.npm.express.mongodb 1.node .npm : (1)辅助工具:homebrew安装(mac下一个软件管理工具,相当于Red hat的yum, ...