这道题是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(合并两个有序链表)的更多相关文章

  1. leetcode 21 Merge Two Sorted Lists 合并两个有序链表

    描述: 合并两个有序链表. 解决: ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { if (!l1) return l2; if (!l2) ...

  2. 【LeetCode】21. Merge Two Sorted Lists 合并两个有序链表

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人公众号:负雪明烛 本文关键词:合并,有序链表,递归,迭代,题解,leetcode, 力 ...

  3. 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 ...

  4. [LeetCode] Merge k Sorted Lists 合并k个有序链表

    Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 这 ...

  5. [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 ...

  6. 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 ...

  7. [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 ...

  8. 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 ...

  9. 023 Merge k Sorted Lists 合并K个有序链表

    合并K个有序链表,并且作为一个有序链表的形式返回.分析并描述它的复杂度. 详见:https://leetcode.com/problems/merge-k-sorted-lists/descripti ...

随机推荐

  1. IE Proxy Swich - IE 代理切换工具

    通过此工具可方便的切换计算机系统代理设置的开关,无需重启IE 来激活设置 下载 环境要求: 可能需要.NET 4.0 以上平台, 其他平台未测试 截图与功能如下 支持快捷方式参数 我个人习惯是在桌面 ...

  2. 利用photoshop制作gif图片

    首先准备你需要的几张素材图片 1.将素材图片根据发生的顺序放置在不同的图层 2.打开窗口下的时间轴 选择帧动画 3.创建第一张帧动画 选项卡右边这个按钮,点击这个选择新建帧 第一张图片显示其他的隐藏 ...

  3. 8. String to Integer

    Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. ...

  4. Codeforces Round #323 (Div. 2) C GCD Table 582A (贪心)

    对角线上的元素就是a[i],而且在所在行和列中最大, 首先可以确定的是最大的元素一定是a[i]之一,这让人想到到了排序. 经过排序后,每次选最大的数字,如果不是之前更大数字的gcd,那么只能是a[i] ...

  5. UVA Mega Man's Mission(状压dp)

    把消灭了那些机器人作为状态S,预处理出状态S下可以消灭的机器人,转移统计方案.方案数最多16!,要用64bit保存方案. #include<bits/stdc++.h> using nam ...

  6. kubernetes-存储卷(十二)

    为了保证数据的持久性,必须保证数据在外部存储在docker容器中,为了实现数据的持久性存储,在宿主机和容器内做映射,可以保证在容器的生命周期结束,数据依旧可以实现持久性存储.但是在k8s中,由于pod ...

  7. ASP.NET各种技巧

    1.动态添加文件框 前台页面关键部分: <script type="text/javascript"> //添加一个选项 function AddFileCtrol() ...

  8. Vscdoe技巧1

    vscdoe常用快捷键 主命令框 F1 或 Ctrl+Shift+P: 打开命令面板.在打开的输入框内,可以输入任何命令,例如: 按一下 Backspace 会进入到 Ctrl+P 模式 在 Ctrl ...

  9. Java continue break 制作简单聊天室程序,屏蔽不文明语言,显示每句话聊天时间 for(;;) SimpleDateFormat("yyyy-MM-dd hh:mm:ss") equalsIgnoreCase

    package com.swift; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Scanne ...

  10. wepy框架构建小程序(1)

    wepy框架构建小程序(1) 基本操作: # 安装脚手架工具 npm install wepy-cli -g # 创建一个新的项目 npm init standard myproject # 进入新项 ...