首页 > 其他分享 >【剑指Offer】16、合并两个排序的链表

【剑指Offer】16、合并两个排序的链表

时间:2023-08-03 23:55:44浏览次数:41  
标签:ListNode Offer 合并 16 list1 list2 链表 排序

【剑指Offer】16、合并两个排序的链表

题目描述:

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

解题思路:

首先需要判断几个特殊情况,即判断输入的两个指针是否为空。如果第一个链表为空,则直接返回第二个链表;如果第二个链表为空,则直接返回第一个链表。如果两个链表都是空链表,合并的结果是得到一个空链表。

两个链表都是排序好的,我们只需要从头遍历链表,判断当前指针,哪个链表中的值小,即赋给合并链表指针,剩余的结点仍然是排序的,所以合并的步骤和之前是一样的,所以这是典型的递归过程,用递归可以轻松实现。

举例:

  编程实现(Java):

    //方法一:递归实现
    public ListNode Merge(ListNode list1,ListNode list2) {
   	if(list1==null)
            return list2;
        if(list2==null)
            return list1;
        ListNode head=null;    //头节点
        if(list1.val<=list2.val){
            head=list1;
            head.next=Merge(list1.next,list2);
        }else{
            head=list2;
            head.next=Merge(list1,list2.next);
        }
        return head;
    }

    //方法二:非递归实现
    public ListNode Merge(ListNode list1,ListNode list2) {
    	if(list1==null)
            return list2;
        if(list2==null)
            return list1;
        ListNode head=new ListNode(-1);//头节点
        ListNode thehead=head;
        while(list1!=null && list2!=null){
            if(list1.val<=list2.val){
                thehead.next=list1;
                list1=list1.next;
            }else{
                thehead.next=list2;
                list2=list2.next;
            }
            thehead=thehead.next;
        }
        if(list1!=null)  //归并完需要检查哪个链表还有剩余
            thehead.next=list1;
        if(list2!=null)
            thehead.next=list2;
        return head.next;
    }

标签:ListNode,Offer,合并,16,list1,list2,链表,排序
From: https://www.cnblogs.com/bujidao1128/p/17604803.html

相关文章

  • [Ynoi2016] 这是我自己的发明(根号分治+分块/莫队)
    题目传送门soltion简单题换根显然可以拆成\(O(1)\)个区间,这里先不管。直接做法是莫队,把双子树拆成\(dfs\)序上的双前缀,可以直接莫队,但是常数比较大。另一种做法是根分,对颜色出现次数分治,大于的求出\(dfs\)序的前缀和即可,小于的因为一共只有\(O(n\sqrtn)\)个点对,所以......
  • 剑指 Offer 04. 二维数组中的查找(中等)
    题目:classSolution{public:boolfindNumberIn2DArray(vector<vector<int>>&matrix,inttarget){inti=matrix.size()-1,j=0;//以矩阵最左下角作为标记符号while(i>=0&&j<matrix[0].size()){i......
  • P7116 [NOIP2020] 微信步数
    原题简化题意:有一个k维场地,第i维宽为wi,即第i维的合法坐标为1,2,···,wi。小C有一个长为n的行动序列,第i元素为二元组(ci,di),表示这次行动小C的坐标由(x1,x2,...,xci,...,xk)变为(x1,x2,...,xci+di,...,xk)。小C会将行动......
  • 剑指 Offer 50. 第一个只出现一次的字符(简单)
    题目:classSolution{public:charfirstUniqChar(strings){charresult='';//如果没找到返回空格vector<int>dic(26,0);//创建一个26个字母的字典,记录每个字母在s中出现的次数for(autoss:s){dic[ss-'a']++;......
  • 剑指 Offer 11. 旋转数组的最小数字(简单)
    题目:classSolution{public:intminArray(vector<int>&numbers){intresult=numbers[0];//当旋转0个元素时第一个元素就是最小值if(numbers.size()==1)returnresult;for(inti=1;i<numbers.size();i++){//通过观......
  • 剑指 Offer 17. 打印从1到最大的n位数
    输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数999。示例1:输入:n=1输出:[1,2,3,4,5,6,7,8,9]无脑classSolution{publicint[]printNumbers(intn){intend=(int)Math.pow(10,n)-1;......
  • Java计算CRC16校验码
    废话不多说,直接上代码/***计算CRC16校验码**@parambytes需要计算的字节数组*/publicstaticbyte[]getCRCByteArray(byte[]bytes){//ModBus通信协议的CRC(冗余循环校验码含2个字节,即16位二进制数。//......
  • 国芯新作 | 四核[email protected],仅168元起?含税?哇!!!
      获取更多T507全国产平台资料可在评论区留言或关注官方公众号~......
  • AMEYA--大唐恩智浦DNB1168助力CTC和CTP新电池技术价值突破
    “里程焦虑”是新能源汽车行业中绕不开的话题。从短期来看,电池材料难有突破性的进展,电池能量密度提升受限。那么,对动力电池进行结构优化、为电芯“腾出”更大的空间,就成为提高汽车续航能力的不二选择。动力电池的瘦身之路传统电池技术都需要经过电芯-模组-装车的过程,即先把......
  • CF1610F Mashtali a Space Oddysey
    撞了个题,还做过。将所有奇度给他建个边权为\(1\)的虚边和对应的虚点,图上一定存在欧拉回路,给欧拉回路定向,记录这个边的入边权值为\(1\)还是为\(2\),优先走上一次走的边权。这样跑的话,会将边权抵消,可以取到答案上界,即相连边权为奇数的点数。#include<bits/stdc++.h>usingna......