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

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

时间:2023-08-11 23:45:33浏览次数:40  
标签: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/17624154.html

相关文章

  • 金三银四送offer,大厂高薪,仅限50名
    又到了一年一度的金三银四求职季,不过今年实在有些诡异,已经3月下旬了,各互联网大厂不见招人,反倒有不少被爆裁员的。脉脉上每天都在更新“上午还在改Bug,下午就被HR通知走人”的恐怖故事。       尽管有些危言耸听,但也说明了目前就业形势的严峻。。。我知道关注我公号的......
  • 女生做16页PPT举报男友出轨,附原版
    女生做16页PPT举报男友出轨,附原版唐哥说创业 ​关注  近日,一份女子举报男友出轨的PPT在网络上流传,举报文档中,该女子搜集男友出轨的照片,聊天记录信息,列举男友出轨“十宗罪”。此事一出,很快就冲上了微博热搜。截至目前,话题阅读次数4.8亿次,讨论次数2.6万,......
  • CodeForces 1610F Mashtali: a Space Oddysey
    洛谷传送门CF传送门比较有启发性的题。首先,设\(a_u\)为与点\(u\)相连的边权和,答案的上界显然是\(\sum\limits_{i=1}^n[a_u\bmod2=1]\)。之后我们把P7816「Stoi2029」以父之名第一篇题解的做法搬过来,也就是:建一个虚点向原图度数为奇数的点连边权为\(1\)的边......
  • 剑指 Offer 13. 机器人的运动范围(中等)
    题目:classSolution{//本题的思路为递归法public:intcal(inti){//先写个计算位数和的函数calintsum=0;while(i){sum+=i%10;i/=10;}returnsum;}voidtraversal(inti,i......
  • P1631 序列合并[优先队列]
    P1631序列合并这个没做出来属实有些惭愧。看了题解觉得很妙。如果直接想的话可能反而很麻烦题目是给两个n个数的不下降序列,问这两个序列任意各取出一个后相加的最小的n个数是什么。直接贴题解吧题解P1631【序列合并】一共会产生n*n个数,a[1]+b[1]<=a[1]+b[2]........<=a[1......
  • Go数组转换,[]byte、[]unint16互相转换的方法封装,完整范例
    需求:分别封装方法将[]byte转换成[]unint16,将[]unint16转换成[]bytebyte相当于unint8分析:长度为20的[]byte转换为长度为10的[]unint16,他们之间的转换如bytes:=[]byte{0,1}  ===》[0*256+1]=1 注意:第奇数乘256加偶数的值则[]uint16的值为[1]完整代码如下:1pack......
  • 再论中位数:离线+链表法
    离线先得到整个序列,从最终开始倒推答案每次删掉一个数要么对中位数没有影响,要么向左/右移动一个为了确定要删除的元素在链表中的位置,使用map记录,重复删完更新向左向右可以按照删除的元素相对于中位数的位置确定,具体分类见代码#include<iostream>#include<cstdio>#include......
  • 我的2016:做精彩的自己
    2016年对于我而言是非常重要的一年,这一年经历了从学生到职场的角色转换,也完成了重要梳理一下我的2016吧。顺利毕业前半年最重要的事情就是博士顺利毕业啦!五年的时间收获颇丰。总结一下有这么几点:最重要的是内心变的非常强大,无所畏惧。在各种艰难险阻下也能保持乐观的心态,不以物喜,不......
  • 《剑指Offer》-57-和为 s 的两个数字
    双指针 vector<int>twoSum(vector<int>&nums,inttarget){ //题目中说了这是一个递增数组,而且我需要两个数字组成s vector<int>res; intsmallDigit=0,bigDigit=nums.size()-1; //这要结果存在,这两个指针就不会相等 //也不能相等,相等就是同一个数字用两......
  • 《剑指Offer》-48-最长不含重复字符串的子字符串
    这题以前做过,和力扣-3重复 intlengthOfLongestSubstring(strings){ //本来应该是用map,但是其实可以使用数组替代,下标对应了字母 unordered_map<char,int>map; intlen=s.size(),maxLen=0;//初始化为0是因为可能字符串长度为0 vector<int>dp(len+1,0);//多......