热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

三个list合并_21.合并两个有序链表

题目将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。输入:1-2-4,1-3-4输出:1-1-
8a4a47c8e9e94cd08891630399e76ce8.png

题目

将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

解答

既然链表是有序的,问题就简单了,按照原来链表的顺序,将他们组合到第三个链表上即可

  • 首先遍历两个链表,分别从list1、list2里面取出第一个元素 然后比较值的大小,小的或者相等的元素,将当前list1的值new出一个节点,然后放到新链表list3里面
  • 新链表list3的指针后移一位、list1的指针后移一位
  • 如果是list1 > list2的话,就把list2的值new出一个节点,然后放到新链表list3里面
  • 新链表list3的指针后移一位、list2的指针后移一位
  • 最后可能存在list1、list2偏大,某一个链表没有比较完,需要把剩下的加入到list3

注意

使用list3的时候,由于list3的指针一直在后移。需要返回list3的头结点的话,需要在开始就保存一个指向list3的头指针

源码

package leetcode;

import java.util.List;

/*** 合并两个有序链表** 为了不影响原链表,要通过new一个新链表的方式,继承原链表* 注意保存原链表的头*/
public class Test21 {
​static class ListNode {
​int val;
​ListNode next;
​ListNode(int x) {val = x;}
​}
​public static ListNode mergeTwoLists(ListNode l1, ListNode l2) {// 把原两个链表的内容放到第三个链表&#xff0c;最后返回第三个链表的 头ListNode l3 &#61; new ListNode(0);ListNode head &#61; l3;while (l1 !&#61; null && l2 !&#61; null) {if (l1.val <&#61; l2.val) {ListNode newNode &#61; new ListNode(l1.val);l3.next &#61; newNode;l3 &#61; l3.next;l1 &#61; l1.next;} else {ListNode newNode &#61; new ListNode(l2.val);l3.next &#61; newNode;l3 &#61; l3.next;l2 &#61; l2.next;}}// 可能存在l1、l2偏大&#xff0c;某一个链表没有比较完&#xff0c;需要把剩下的加入到l3while (l1 !&#61; null) {ListNode newNode &#61; new ListNode(l1.val);l3.next &#61; newNode;l3 &#61; l3.next;l1 &#61; l1.next;}while (l2 !&#61; null) {ListNode newNode &#61; new ListNode(l2.val);l3.next &#61; newNode;l3 &#61; l3.next;l2 &#61; l2.next;}
​return head.next;}
​public static void main(String[] args) {ListNode l1 &#61; new ListNode(1);ListNode l2 &#61; new ListNode(2);ListNode l3 &#61; new ListNode(4);l1.next &#61; l2;l2.next &#61; l3;
​ListNode l11 &#61; new ListNode(1);ListNode l22 &#61; new ListNode(3);ListNode l33 &#61; new ListNode(4);l11.next &#61; l22;l22.next &#61; l33;
​ListNode ans &#61; mergeTwoLists(l1, l11);while (ans !&#61; null) {System.out.print(ans.val);ans &#61; ans.next;}}
}

扩展

题目&#xff1a;合并K个排序链表

合并 k 个排序链表&#xff0c;返回合并后的排序链表。请分析和描述算法的复杂度。

输入:
[1->4->5,1->3->4,2->6
]
输出: 1->1->2->3->4->4->5->6

解答

原理同合并两个有序链表是一样的 只不过需要循环取出集合里面的各个链表&#xff0c;每两个比较一次&#xff0c;循环结束后返回最终比较结果即可

源码

package leetcode;

/*** 合并K个排序链表*/
public class Test23 {
​static class ListNode {int val;ListNode next;
​ListNode(int x) {val &#61; x;}}
​public static ListNode mergeTwoLists(ListNode l1, ListNode l2) {ListNode l3 &#61; new ListNode(0);ListNode head &#61; l3;while (l1 !&#61; null && l2 !&#61; null) {if (l1.val <&#61; l2.val) {ListNode newNode &#61; new ListNode(l1.val);l3.next &#61; newNode;l3 &#61; l3.next;l1 &#61; l1.next;} else {ListNode newNode &#61; new ListNode(l2.val);l3.next &#61; newNode;l3 &#61; l3.next;l2 &#61; l2.next;}}while (l1 !&#61; null) {ListNode newNode &#61; new ListNode(l1.val);l3.next &#61; newNode;l3 &#61; l3.next;l1 &#61; l1.next;}while (l2 !&#61; null) {ListNode newNode &#61; new ListNode(l2.val);l3.next &#61; newNode;l3 &#61; l3.next;l2 &#61; l2.next;}return head.next;}
​public ListNode mergeKLists(ListNode[] lists) {if (lists.length &#61;&#61; 0) {return new ListNode(0).next;}
​if (lists.length &#61;&#61; 1) {return lists[0];}ListNode l1 &#61; lists[0];// 循环比较&#xff0c;将结果放到l1中&#xff0c;然后又把l1拿出来用for (int i &#61; 1; i ​}return l1;}
}




推荐阅读
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • importjava.util.ArrayList;publicclassPageIndex{privateintpageSize;每页要显示的行privateintpageNum ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
author-avatar
CCTV2财经2677
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有