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

链表的定义如下:

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)定义一条新的链表,同时遍历两条链表并比较遍历到的结点的值,较小的值加入到新链表。

这种方法相较于第一种方法,内存空间占用小,且只遍历两条链表各一次,执行较快。但是由于链表结构的特殊性,需要考虑结点是否为null,其中一个链表已经遍历完毕的判断及处理,实现较第一种方法更难一些。值得注意的是:这里创建一个新的链表,原链表的的结点并没有改变。

3)上面两种方法是我看到题目就能立马想到的方法。第一种方法容易实现但是耗时长,内存占用多。第二种虽然耗时较短,但是新链表合并了两个链表内存占用还是不小的。

于是经过我仔细思考我得到了第三种方法。

由于并没有要求不能改变原链表结点,所有可以将其中一条链表插入另一条完成合并。我采用的就是这种方式。

具体解决思路如下:

1)链表问题先判断空链表的情况
2)根据两个链表首个结点的值的大小,决定哪个为返回链表,哪个为插入链表
          具体规则:
                  如果list1.val <= list2.val list1为返回链表,list2为插入链表
3)链表的插入规则:
          l1:返回链表正在遍历的结点
          l2:插入链表正在遍历的结点
          1、如果l1.next为null,则此时l1遍历到返回链表的尾部,那么l2及剩余结点的值一定大于l1,此时指向l2再放回链表就可以了。
          2、如果l2.val介于l1与l1.next之间,获取l2的值创建新结点,再插入新结点到l1
          3、如果l2中不能插入,即不满足上述条件,则l1往后继续遍历

具体的代码实现:

 public ListNode mergeTwoLists(ListNode list1, ListNode list2) {//链表为空的判断if(list1 == null && list2 == null){return null;}else if(list1 == null){return list2;}else if(list2 == null){return list1;}//用于指向list1中正在遍历的结点ListNode l1 = null;//用于指向list2中正在遍历的结点ListNode l2 = null;//用于指向返回链表ListNode l = new ListNode();/*根据首个元素值的大小决定哪个链表作为返回链表,哪个作为插入链表例如:list1.val <= list2.val则将list2作为插入链表,将list2中的结点插入到list1中*/if(list1.val <= list2.val){l1 = list1;l2 = list2;l.next = list1;}else{l1 = list2;l2 = list1;l.next = list2;}//l2为插入链表,则只要l2没有结点则循环结束while(l2 != null){if(l1.next == null){//如果遍历到了l1尾部,那么l2剩余的结点元素一定比l1尾部的值大,l1.next = l2;return l.next;}else if(l2.val >= l1.val && l2.val < l1.next.val){//如果l2的元素值介于l1的两个结点中间,则插入该结点ListNode tmp = l1.next;l1.next = new ListNode(l2.val);//创建一个值与l2值相同的结点,再插入到l1l1.next.next = tmp;l1 = l1.next;l2 = l2.next;}else{//无插入操作则后移l1 = l1.next;}}return l.next;}

备注:我实现时是取出插入链表的值再插入到返回链表,仍然占用了一部分内存。如果想继续优化则需要用临时结点,直接插入会找不到返回链表的剩余结点。

java解决合并两个有序链表问题相关推荐

  1. 《LeetCode力扣练习》第21题 合并两个有序链表 Java

    <LeetCode力扣练习>第21题 合并两个有序链表 Java 一.资源 题目: 将两个升序链表合并为一个新的 升序 链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例 ...

  2. 【Java】leetCode 21 合并两个有序链表

    题目 : 将两个升序链表合并为一个新的 升序 链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 解题思路 : 1.依据以上两个升序链表进行拼接: 2.先定义一个傀儡节点newHead,用来 ...

  3. java合并两个有序链表_JS实现的合并两个有序链表算法示例

    本文实例讲述了JS实现的合并两个有序链表算法.分享给大家供大家参考,具体如下: 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1-> ...

  4. Java实现 LeetCode 21 合并两个有序链表

    21. 合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1 ...

  5. LeetCode 21合并两个有序链表22括号生成

    微信搜索bigsai,回复进群,加入打卡.维护不易,欢迎点赞支持! 合并两个有序列表 将两个升序链表合并为一个新的 升序 链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1 ...

  6. 【LeetCode】【HOT】21. 合并两个有序链表(递归)

    [LeetCode][HOT 100]21. 合并两个有序链表 文章目录 [LeetCode][HOT 100]21. 合并两个有序链表 package hot;import java.util.Ar ...

  7. 两个有序链表序列的交集_剑指offer第21天:合并两个有序链表

    我准备了 1000 本电子书和计算机各领域高清思维导图 100 张,关注后回复[资源],即可获取!更可回复[内推]加入 BAT 内推群! 01.题目分析 第21题:合并两个有序链表 将两个有序链表合并 ...

  8. 021合并两个有序链表

    合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. C语言: /*** Definition for singly-linked lis ...

  9. 【每日一算法】 合并两个有序链表

    微信改版,加星标不迷路! 每日一算法-合并两个有序链表 作者:阿广 阅读目录 1 题目 2 解析 1 题目 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. ...

  10. 合并两个有序链表分析

    合并两个有序链表: 将两个升序链表合并为一个新的 升序 链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: l1 l2 输入:1->2->4, 1->3->4 ...

最新文章

  1. 近4万Star,登月源码登顶GitHub,这位女程序员“拯救”了阿波罗
  2. 利用tftp和nfs下载文件到开发板
  3. ACM竞赛学习整理--Gauss求解POJ1166
  4. .net2.0 orm_Hibernate 4.3 ORM工具
  5. 陶陶摘苹果(洛谷-P1046)
  6. python时间格式转换time模块
  7. 谷歌浏览器不能安装离线插件——可行方法
  8. Android商城开发系列(六)——使用 OkHttpUtils 请求网络 + 使用 fastjson解析数据...
  9. Servlet3.0 多图片,文件上传
  10. 业务运维:站在企业转型风口上的云智慧
  11. php 警告方法 不可用,升级PHP版本后警告信息的逐一解决
  12. linux unix域socket_计算机通信之谜,带你彻底理解socket网络编程(一)
  13. 新手指引,php什么是常量、变量、数组、类和对象及方法?
  14. WORD里表格复制到另一WORD里表格会变形的解决办法
  15. 海南大学信号与系统838报考高频问题整理(4)
  16. 用hc05蓝牙模块,开发了几个安卓app了,越来越熟悉蓝牙app了。
  17. 2022-2027年中国知识产权代理行业发展前景及投资战略咨询报告
  18. CC BY-SA 4.0知识共享许可协议
  19. spark算子详细介绍(v、k-v、vv类型)
  20. Shotgun/Shotgrid入门学习笔记一

热门文章

  1. HTML和JavaScript学习笔记
  2. 基于JSP+Servlet+MySQL的在线问卷调查系统(附论文)
  3. 小程序 实现语音播放功能
  4. Django搭建后台管理系统
  5. cad快速选择命令快捷键_CAD快捷键命令大全
  6. 4k hidpi 黑苹果_关于4K,1440P显示屏开启HIdpi的问题
  7. RHEL7安装配置FTP服务
  8. ABAQUS地应力平衡方法详解
  9. Lora服务器:Chirpstack连接Lora网关实战
  10. ubuntu18.04: 安装nanomsg