剑指offer JZ25 合并两个排序的链表
创始人
2024-06-02 02:04:51
0次

Java 合并两个排序的链表


文章目录

  • Java 合并两个排序的链表
  • 一、问题描述
  • 二、迭代版本求解
  • 三、借助额外数组


  使用迭代和借助额外数组解决剑指offer第JZ25题合并两个排序的链表的问题。


一、问题描述

  输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。
  数据范围: 0≤ n≤1000,−1000≤节点值≤1000
  如输入{1,3,5},{2,4,6}时,合并后的链表为{1,2,3,4,5,6},所以对应的输出为{1,2,3,4,5,6},转换过程如下图所示:

在这里插入图片描述
  示例:

输入:{-1,2,4},{1,3,4}返回值:{-1,1,2,3,4,4}

二、迭代版本求解

  操作:
 ●1.先判断list1和list2是不是为空,如果有一个为空,那另一个即为所求输出;
 ●2.初始化:定义head指向新链表的头结点,newList用于指向新节点。
 ●3.循环判断list1和list2节点值的大小,如果list1指向的结点值小于等于list2指向的结点值,则将list1指向的结点值链接到newList的next指针,然后list1指向下一个结点值,否则,让list2指向下一个结点值。
 ●4.循环对比步骤,直到list1或者list2为null,将list1或者list2剩下的部分链接到newList的后面。

/*
public class ListNode {int val;ListNode next = null;ListNode(int val) {this.val = val;}
}*/public class Solution {public ListNode Merge(ListNode list1, ListNode list2) {//判断是否有空链表if (list2 == null) {return list1;}if (list1 == null) {return list2;}if(list1 == null && list2 == null){return null;}//创建head指向新链表的头结点,newList用于指向新节点。ListNode head = new ListNode(0);ListNode  newList= head;//   循环判断list1和list2节点值的大小while (list1 != null && list2 != null) {switch (list1.val <= list2.val ? 1 : 2) {  //三元运算符case 1:      newList.next = list1;      //list1.val <= list2.val,将list1指向的结点值链接到newList的next指针list1 = list1.next;        //list1指向下一个结点值break;case 2: newList.next = list2;     //list1.val > list2.val,将list2指向的结点值链接到newList的next指针list2 = list2.next;       //list2指向下一个结点值break;}newList = newList.next;     //添加一个链表元素后,newList指向下一个结点值,重新循环添加}//  list1或者list2为null,将list1或者list2剩下的部分链接到newList的后面。if(list1 == null){newList.next = list2;}if(list2 == null){newList.next = list1;}return head.next;  //头结点head是空,head的下一个节点才是第一个有值的节点}
}

三、借助额外数组

  解题思路:
 ●1.创建额外存储数组 nums
 ●2.依次循环遍历 pHead1, pHead2,将链表中的元素存储到 nums中,再对nums进行排序
 ●3.依次对排序后的数组 nums取数并构建合并后的链表

public class Solution {public ListNode Merge(ListNode list1,ListNode list2) {// list1 或者list2为空的情况if(list1==null) return list2;if(list2==null) return list1;if(list1 == null && list2 == null){return null;}//将两个链表存放在list中ArrayList list = new ArrayList<>();// 遍历存储list1while(list1!=null){list.add(list1.val);list1 = list1.next;}// 遍历存储list2while(list2!=null){list.add(list2.val);list2 = list2.next;}// 对 list 排序Collections.sort(list);// 将list转换为 链表ListNode newHead = new ListNode(list.get(0));ListNode cur = newHead;for(int i=1;i

注意
  Collections类中的sort方法可以实现对List接口的集合进行排序。这个方法假定列表元素实现了Comparable接口。可以根据指定比较器产生的顺序对指定列表进行排序。

sort(List list, Comparator c) 

   Collections.sort(list);实现升序排列
   Collections.sort(list,Collections.reverseOrder());实现降序排列

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...