【LeetCode】Merge Two Sorted Lists(合并两个有序链表)
这道题是LeetCode里的第21道题。
题目描述:
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
这道题需要考虑的地方挺多的,首先是头节点的处理,还有尾节点的链接问题。对于头节点,我的想法是先对 l1, l2 的值进行比较,然后把 l1 指向头节点值小的,这样保证了 l1 绝对小于等于 l2,也就是说头节点的链接问题解决,中间部分好办,可以一个一个比较链接,也可以一块一块的链接,这里我使用的是一块一块的链接,而且对于尾部有三种情况需要考虑:
- 同时到达尾部
- l1 先到达尾部
- l2 先到达尾部
具体代码中有所表现,自己可以画图理解理解。
解题代码:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if(l1 == null)return l2;
if(l2 == null)return l1;
ListNode node1 = new ListNode(0);
ListNode node2 = new ListNode(0);
ListNode preNode1 = new ListNode(0);
ListNode preNode2 = new ListNode(0);
if(l1.val > l2.val) {
node1 = l2;
l2 = l1;
l1 = node1;
}//l1一定是小于等于l2
node1 = l1;
node2 = l2;
preNode1 = l1.next;
preNode2 = l2.next;
while(preNode1 != null && preNode2 != null) {
while(preNode1 != null && preNode1.val <= l2.val) {//说明是要从node1开始链接
node1 = preNode1;
preNode1 = node1.next;
}
while(preNode1 != null && preNode2 != null && preNode2.val <= preNode1.val) {
node2 = preNode2;
preNode2 = node2.next;
}
if(preNode1 == null && preNode2 != null) break;//l1到达尾部,此时需要保证node1指向的是一个有效的节点
node1.next = l2;
node2.next = preNode1;
l2 = preNode2;
if(preNode1 != null)//如果l2到达尾部,则此时node2==null,也就是说这个时候整个连接操作已经完成
node1 = preNode1;
node2 = preNode2;
if(preNode1 == null || preNode2 == null) break;//l2到达尾部
preNode1 = preNode1.next;
preNode2 = preNode2.next;
}
if(node2 != null) {//判断l2是否到达尾部
while(node1.next != null && node1.next.val < node2.val) {
node1 = node1.next;
}
if(node1.next != null) {//此时node2!=null,判断node1是否等于null
node2.next = node1.next;//不等于则把node1后大于node2值的节点链接至node2
node1.next = node2;//然后node1再链接node2
}else {
node1.next = node2;//等于直接把node2链接至node1
}
}
return l1;
}
}
提交结果:

个人总结:
这题错误次数比较多,原因在于最后的节点处理不当,多次造成循环链表或者是顺序错误,或是节点缺失。
【LeetCode】Merge Two Sorted Lists(合并两个有序链表)的更多相关文章
- leetcode 21 Merge Two Sorted Lists 合并两个有序链表
描述: 合并两个有序链表. 解决: ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { if (!l1) return l2; if (!l2) ...
- 【LeetCode】21. Merge Two Sorted Lists 合并两个有序链表
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人公众号:负雪明烛 本文关键词:合并,有序链表,递归,迭代,题解,leetcode, 力 ...
- LeetCode 21. Merge Two Sorted Lists合并两个有序链表 (C++)
题目: Merge two sorted linked lists and return it as a new list. The new list should be made by splici ...
- [LeetCode] Merge k Sorted Lists 合并k个有序链表
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 这 ...
- [LeetCode]21. Merge Two Sorted Lists合并两个有序链表
Merge two sorted linked lists and return it as a new list. The new list should be made by splicing t ...
- 021 Merge Two Sorted Lists 合并两个有序链表
Merge two sorted linked lists and return it as a new list. The new list should be made by splicing t ...
- [LeetCode] 23. Merge k Sorted Lists 合并k个有序链表
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. E ...
- 21. Merge Two Sorted Lists(合并2个有序链表)
21. Merge Two Sorted Lists Merge two sorted linked lists and return it as a new list. The new list s ...
- 023 Merge k Sorted Lists 合并K个有序链表
合并K个有序链表,并且作为一个有序链表的形式返回.分析并描述它的复杂度. 详见:https://leetcode.com/problems/merge-k-sorted-lists/descripti ...
随机推荐
- app后台管理系统框架metronic的学习笔记
先来看效果: 给出当前页面的代码: <!DOCTYPE html> <!--[if IE 8]> <html lang="zh" class=&quo ...
- C#之linq
本文根据30分钟LINQ教程学习作的笔记. 1.Guid.Empty Guid 结构: 表示全局唯一标识符 (GUID).Empty字段:Guid 结构的只读实例,其值均为零.用来设置初始值. G ...
- Nginx+Keepalived双主轮询负载均衡
双主模式使用两个VIP,前段有2台服务器,互为主从,两台服务器同时工作,不存在资源浪费情况.同时在前端的DNS服务器对网站做多条A记录,实现了Nginx的负载均衡,当一台服务器故障时候,资源会转移到另 ...
- html常用的小技能
在html中有很多常用小技能,记下来,下次直接看自己的,就不用四处找啦! 1.<li>标签去掉点号:list-style-type:none; 去掉前: 去掉后: 2.<li> ...
- Sentinel spring-cloud-gateway adapter(1.6)异常错误之@EnableCircuitBreaker
sentinal 大坑 使用gateway adaper包出现@EnableCircuitBreaker did you forget include starter的异常 这时候千万不要学我引入cl ...
- python时间转换 ticks-FYI
#设a为字符串 import time a = "2011-09-28 10:00:00" #中间过程,一般都需要将字符串转化为时间数组 time.strptime(a,'%Y-% ...
- 分析ELF的加载过程
http://blog.chinaunix.net/uid-72446-id-2060538.html 对于可执行文件来说,段的加载位置是固定的,程序段表中如实反映了段的加载地址.对于共享库来?段的加 ...
- 【BZOJ2754】[SCOI2012] 喵星球上的点名(后缀数组+莫队)
点此看题面 大致题意: 每个人的名字由姓和名构成,如果某次点名点到的字符串是某人姓或名的一个子串,则这个人就被点到了.求每次点名被点到的人的个数及每个人被点到的总次数. 后缀数组+莫队 这道题做法很多 ...
- flutter 踩坑总结
导入第三方库踩坑小结: (编译器:VsCode) ( 打算在学习中,使用flutter重新自己的项目,遇到比较特殊的坑,就先记录一下,持续更新中) 1.把第三方库 写入pubspec.yaml文件中 ...
- python_15_os
import os #1. os.system('dir') #2 cmd_res=os.system('dir')#执行命令不保存结果 print("-------",cmd_r ...