【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 ...
随机推荐
- nrm—源管理工具
全局安装 npm install -g nrm 查看可选源 nrm ls 其中,带*的是当前使用的源,上面的输出表明当前源是hiknpm 切换源 nrm use taobao 新增源 nrm add ...
- Redis多机数据库
复制 PSYNC命令具有完整重同步(full resynchronization)和部分重同步(partial resynchronization)两种模式: ·其中完整重同步用于处理初次复制情况:完 ...
- hdu-3371 Connect the Cities---kruskal
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3371 题目大意: 给n个城市,m条路,k组已知路,求最小费用联通所有城市: 解题思路: kruska ...
- POJ-2195 Going Home---KM算法求最小权值匹配(存负边)
题目链接: https://vjudge.net/problem/POJ-2195 题目大意: 给定一个N*M的地图,地图上有若干个man和house,且man与house的数量一致.man每移动一格 ...
- 【洛谷3796】【模板】AC自动机(加强版)
点此看题面 大致题意: 一道模板题,给你\(N\)个模式串和一个文本串,要你求出在文本串中出现次数最多的若干个模式串并输出它们. \(AC\)自动机 都说了是\(AC\)自动机的模板题,做法肯定是\( ...
- 标准输入输出 stdio 流缓冲 buffering in standard streams
From : http://www.pixelbeat.org/programming/stdio_buffering/ 译者:李秋豪 我发现找出标准流用的是什么缓冲是一件困难的事. 例如下面这个使用 ...
- flex在众多手机浏览器上的兼容方案(亲测华为手机自带浏览器)
如果项目使用构建工具,可加autoprefixer来处理,[autoprefixer使用指南] 纯手写css兼容代码,需给每个使用的属性加上属性前缀 /*display: flex;写法*/ span ...
- 利用Theano理解深度学习——Multilayer Perceptron
一.多层感知机MLP 1.MLP概述 对于含有单个隐含层的多层感知机(single-hidden-layer Multi-Layer Perceptron, MLP),可以将其看成是一个特殊的Logi ...
- SqlServer2000事件探测器的使用
由于公司自己开发的项目,需要与第三方软件数据库对接.我们项目用的数据库是MySQL而第三方用的是sqlserver2000.项目框架用的thinkphp5.0,通过thinkPHP新建一个模块,单独连 ...
- 操作系统(1)_操作系统结构_李善平ppt
cpu和内存之间通过地址总线.数据总线.控制总线连接.外部总线连接外部设备.下图有问题,内存和外设没有直接连接.同一组总线,CPU和内存连接的时候硬盘就不能和内存连接,否则有冲突,core和core之 ...