这道题是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. 删除elasticsearch大于7天前的索引

    curl -u 用户名:密码 -H'Content-Type:application/json' -d'{ "query": { "range": { &quo ...

  2. ASP.NET中登陆验证码的生成和输入验证码的验证

    一:验证码的生成实现代码 protected void Page_Load(object sender, EventArgs e)    {        string validateCode = ...

  3. pta数据结构编程题

    编程题6 树的同构 编程题7 List Leaves 编程题8 Tree Traversals Again 编程题10 Root of AVL Tree 编程题12 堆中的路径 编程题13 File ...

  4. Android(java)学习笔记86:Android提供打开各种文件的API接口:setDataAndType

    1. Android 打开各种文件(setDataAndType) private void openFile(File file){ Intent intent = new Intent(); in ...

  5. 【BZOJ1101】[POI2007] Zap(莫比乌斯反演)

    点此看题面 大致题意: 求\(\sum_{x=1}^N\sum_{y=1}^M[gcd(x,y)==d]\). 一道类似的题目 推荐先去做一下这道题:[洛谷2257]YY的GCD,来初步了解一下莫比乌 ...

  6. 转载请注明:Windows 系统必备好用软件&工具合集跟推荐 | 老D博客

    Windows 系统必备好用软件&工具合集跟推荐 97 63,371 A+ 所属分类:工具软件 一.浏览器 二.下载软件 三.播放软件 五.电子邮件客户端 六.图片/照片 浏览查看工具 七.文 ...

  7. webpack4简单入门

    安装webpack需要安装node环境,因此需要在电脑中安装node.node官网https://nodejs.org/,安装LTS版本即可. webpck基本概念 entry:分析依赖模块的入口 o ...

  8. 更新MySQL数据库( java.sql.SQLException: No value specified for parameter 1) 异常 解决方法

    package com.swift; import java.io.File; import java.sql.Connection; import java.sql.PreparedStatemen ...

  9. PHP数据库扩展 - PDO操作

    PDO操作 PDO操作 描述:odp是php对数据库操作统一化的操作 语法:$pdo = new PDO("DB名:host=主机名;dbname=DB名","DB账号& ...

  10. (SSO)单点登录原理和总结

    一:什么是单点登录(single Sign-On) SSO 是一种统一认证和授权机制,指访问统一服务器不用应用中的受保护资源的同一用户,只需要登录一次,即通过一个应用中的安全验证后, 再访问其他应用中 ...