剑指offer25:合并两个排序的链表

2024-03-01 20:38

本文主要是介绍剑指offer25:合并两个排序的链表,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

剑指offer25
题目要求:给两个非递减单链表l1, l2,合并为一个非递减的单链表。

方法一:迭代

类似合并两个有序数组 ,注意此题一旦有一个链表越界,则剩下的另一个直接接到curr.next即可,而不用while 多次放入! 区别数组 !

原理视频讲解

流程
1.建立一个新的链表mer , mer也是哨兵节点(不存数据),并创建curr节点作为指针,用于存储每次新加入的节点
2. 比较list1和list2,将较小的节点添加至新链表,使用curr.next来记录。
:每一轮只能添加一个节点!若一轮在list1和list2先后添加两个节点,则无法保证新链表中的递增排序!
3. 跳出循环,将剩余节点添加至新链表
4. 返回哨兵节点的next即为新链表的第一个节点

public class Solution {public ListNode Merge(ListNode list1,ListNode list2) {if(list1==null){return list2;}else if(list2==null){return list1;}ListNode mer=new ListNode(-1); //创建新链表,头节点为哨兵节点,不装数据ListNode curr=mer;  //指针,记录新添加的节点!while(list1!=null&list2!=null){ //同时都不为空才比较if(list1.val<list2.val){curr.next=list1;  //将小的添加至新链表的指针后面list1=list1.next;}else{curr.next=list2;list2=list2.next;}curr=curr.next; //更新指针}//跳出循环if(list1==null){ //list1为null,list2都有可能curr.next=list2; }else{curr.next=list1; //list1不为null,list2为null}return mer.next; //mer还是新链表的头节点,从mer.next开始即有数

注意:

  1. 使用哨兵节点是常见的手法,可以简化代码并防止空指针异常

方法二:暴力解法

  • 直接将两个链表的节点的val值放进最小优先队列priorityQueue;
  • 然后priorityQueue依次 poll()弹出,添加至新的链表即可,注意使用了哨兵节点
  1. 不能把节点放进优先队列,因为节点ListNode没有继承Comparable,优先队列无法比较谁最小。
  2. pq弹出的是val值,类型是int,要转化为ListNode再添加至题目要求的新链表
public class Solution {public ListNode Merge(ListNode list1,ListNode list2) {PriorityQueue<Integer> pq=new PriorityQueue<>();//将两个链表节点的val循环放入优先队列pq while(list1!=null){pq.add(list1.val);  // pq存的元素要继承Comparable才能被比较!list1=list1.next;}while(list2!=null){pq.add(list2.val);list2=list2.next;}ListNode mer=new ListNode(-1); //用哨兵节点mer创建新链表ListNode curr=mer; //curr作为记录新添加节点的指针while(!pq.isEmpty()){ListNode temp=new ListNode(pq.poll()); //每轮必须新建ListNode类来装val,链表存的是ListNode而不是valcurr.next=temp;//添加节点curr=curr.next;//跟新指针}return mer.next;}
}

这篇关于剑指offer25:合并两个排序的链表的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/763732

相关文章

关于Java内存访问重排序的研究

《关于Java内存访问重排序的研究》文章主要介绍了重排序现象及其在多线程编程中的影响,包括内存可见性问题和Java内存模型中对重排序的规则... 目录什么是重排序重排序图解重排序实验as-if-serial语义内存访问重排序与内存可见性内存访问重排序与Java内存模型重排序示意表内存屏障内存屏障示意表Int

不删数据还能合并磁盘? 让电脑C盘D盘合并并保留数据的技巧

《不删数据还能合并磁盘?让电脑C盘D盘合并并保留数据的技巧》在Windows操作系统中,合并C盘和D盘是一个相对复杂的任务,尤其是当你不希望删除其中的数据时,幸运的是,有几种方法可以实现这一目标且在... 在电脑生产时,制造商常为C盘分配较小的磁盘空间,以确保软件在运行过程中不会出现磁盘空间不足的问题。但在

锐捷和腾达哪个好? 两个品牌路由器对比分析

《锐捷和腾达哪个好?两个品牌路由器对比分析》在选择路由器时,Tenda和锐捷都是备受关注的品牌,各自有独特的产品特点和市场定位,选择哪个品牌的路由器更合适,实际上取决于你的具体需求和使用场景,我们从... 在选购路由器时,锐捷和腾达都是市场上备受关注的品牌,但它们的定位和特点却有所不同。锐捷更偏向企业级和专

在C#中合并和解析相对路径方式

《在C#中合并和解析相对路径方式》Path类提供了几个用于操作文件路径的静态方法,其中包括Combine方法和GetFullPath方法,Combine方法将两个路径合并在一起,但不会解析包含相对元素... 目录C#合并和解析相对路径System.IO.Path类幸运的是总结C#合并和解析相对路径对于 C

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

csu1329(双向链表)

题意:给n个盒子,编号为1到n,四个操作:1、将x盒子移到y的左边;2、将x盒子移到y的右边;3、交换x和y盒子的位置;4、将所有的盒子反过来放。 思路分析:用双向链表解决。每个操作的时间复杂度为O(1),用数组来模拟链表,下面的代码是参考刘老师的标程写的。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

day-51 合并零之间的节点

思路 直接遍历链表即可,遇到val=0跳过,val非零则加在一起,最后返回即可 解题过程 返回链表可以有头结点,方便插入,返回head.next Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*

hdu 1285(拓扑排序)

题意: 给各个队间的胜负关系,让排名次,名词相同按从小到大排。 解析: 拓扑排序是应用于有向无回路图(Direct Acyclic Graph,简称DAG)上的一种排序方式,对一个有向无回路图进行拓扑排序后,所有的顶点形成一个序列,对所有边(u,v),满足u 在v 的前面。该序列说明了顶点表示的事件或状态发生的整体顺序。比较经典的是在工程活动上,某些工程完成后,另一些工程才能继续,此时