java解决合并两个有序链表问题
问题:将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
链表的定义如下:
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解决合并两个有序链表问题相关推荐
- 《LeetCode力扣练习》第21题 合并两个有序链表 Java
<LeetCode力扣练习>第21题 合并两个有序链表 Java 一.资源 题目: 将两个升序链表合并为一个新的 升序 链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例 ...
- 【Java】leetCode 21 合并两个有序链表
题目 : 将两个升序链表合并为一个新的 升序 链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 解题思路 : 1.依据以上两个升序链表进行拼接: 2.先定义一个傀儡节点newHead,用来 ...
- java合并两个有序链表_JS实现的合并两个有序链表算法示例
本文实例讲述了JS实现的合并两个有序链表算法.分享给大家供大家参考,具体如下: 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1-> ...
- Java实现 LeetCode 21 合并两个有序链表
21. 合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1 ...
- LeetCode 21合并两个有序链表22括号生成
微信搜索bigsai,回复进群,加入打卡.维护不易,欢迎点赞支持! 合并两个有序列表 将两个升序链表合并为一个新的 升序 链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1 ...
- 【LeetCode】【HOT】21. 合并两个有序链表(递归)
[LeetCode][HOT 100]21. 合并两个有序链表 文章目录 [LeetCode][HOT 100]21. 合并两个有序链表 package hot;import java.util.Ar ...
- 两个有序链表序列的交集_剑指offer第21天:合并两个有序链表
我准备了 1000 本电子书和计算机各领域高清思维导图 100 张,关注后回复[资源],即可获取!更可回复[内推]加入 BAT 内推群! 01.题目分析 第21题:合并两个有序链表 将两个有序链表合并 ...
- 021合并两个有序链表
合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. C语言: /*** Definition for singly-linked lis ...
- 【每日一算法】 合并两个有序链表
微信改版,加星标不迷路! 每日一算法-合并两个有序链表 作者:阿广 阅读目录 1 题目 2 解析 1 题目 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. ...
- 合并两个有序链表分析
合并两个有序链表: 将两个升序链表合并为一个新的 升序 链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: l1 l2 输入:1->2->4, 1->3->4 ...
最新文章
- 近4万Star,登月源码登顶GitHub,这位女程序员“拯救”了阿波罗
- 利用tftp和nfs下载文件到开发板
- ACM竞赛学习整理--Gauss求解POJ1166
- .net2.0 orm_Hibernate 4.3 ORM工具
- 陶陶摘苹果(洛谷-P1046)
- python时间格式转换time模块
- 谷歌浏览器不能安装离线插件——可行方法
- Android商城开发系列(六)——使用 OkHttpUtils 请求网络 + 使用 fastjson解析数据...
- Servlet3.0 多图片,文件上传
- 业务运维:站在企业转型风口上的云智慧
- php 警告方法 不可用,升级PHP版本后警告信息的逐一解决
- linux unix域socket_计算机通信之谜,带你彻底理解socket网络编程(一)
- 新手指引,php什么是常量、变量、数组、类和对象及方法?
- WORD里表格复制到另一WORD里表格会变形的解决办法
- 海南大学信号与系统838报考高频问题整理(4)
- 用hc05蓝牙模块,开发了几个安卓app了,越来越熟悉蓝牙app了。
- 2022-2027年中国知识产权代理行业发展前景及投资战略咨询报告
- CC BY-SA 4.0知识共享许可协议
- spark算子详细介绍(v、k-v、vv类型)
- Shotgun/Shotgrid入门学习笔记一