首页 > 其他分享 >【力扣刷题】合并两个有序链表

【力扣刷题】合并两个有序链表

时间:2024-02-24 20:33:34浏览次数:26  
标签:力扣 ListNode 递归 cur1 next 链表 l2 刷题

题目描述

image

分析

这道题实际的解法是要通过递归来写,由于链表的特性:链表的任何一个子表都是链表。所以很多链表的算法用递归来写会非常简便。这里先尝试着写一下非递归的算法,再写一遍递归的算法。
非递归:

class Solution {
public:
    // void Insert(ListNode* node1, ListNode* node2){
    //     //将node2的元素值插入到node1的后面
    //     ListNode* newNode = new ListNode(node2->val, node1-> next);
    //     node1 -> next = newNode;
    //     return ;
    // }
    ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
        if(list1 == nullptr){
            return list2;
        }
        if(list2 == nullptr){
            return list1;
        }
        ListNode* Dummy1 = new ListNode();
        ListNode* Dummy2 = new ListNode();
        Dummy1 -> next = list1;
        Dummy2 -> next = list2;
        ListNode* cur1 = Dummy1;
        ListNode* cur2 = Dummy2;

        int num;
        //把cur2的结点依次加入到cur1中
        while(cur2 -> next != nullptr){
            num = cur2 -> next -> val;
            while(cur1 -> next != nullptr && num >= cur1 -> next -> val){
                cur1 = cur1 -> next;
            }
            ListNode* newNode = new ListNode(num, cur1-> next);
            cur1-> next = newNode;
            cur1 = newNode;
            cur2 = cur2 -> next;
        }
        // //处理list2的剩余部分
        // if(cur2 )
        return Dummy1 -> next;
    }
};

如上所示,按常规的思路,注意还是尽量用附加头节点,否则指针移动到链表结尾时会很不好处理,就算能处理好代码也会很臃肿。
在写关于链表的算法时都要想一想能不能用递归算法秒杀。
下面展示一下官方题解的递归算法:

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        if (l1 == nullptr) {
            return l2;
        } else if (l2 == nullptr) {
            return l1;
	//开头两个条件分支是处理有空链表时的特殊情况
	//不仅如此,这个情况也是递归到最底下的最终原子情况,
	//到这里后递归开始回溯
        } else if (l1->val < l2->val) {
            l1->next = mergeTwoLists(l1->next, l2);
            return l1;
        } else {
            l2->next = mergeTwoLists(l1, l2->next);
            return l2;
        }
	//后面两个分支,把较小的一个链表结点选中为已处理好的部分,
	//然后利用递归把剩下的部分再合并,接到已处理部分的后面
	//非常巧妙
    }
};

标签:力扣,ListNode,递归,cur1,next,链表,l2,刷题
From: https://www.cnblogs.com/satsuki26681534/p/18031517

相关文章

  • 代码随想录算法训练营day03 | leetcode 203. 移除链表元素、707. 设计链表、206. 反转
    目录题目链接:203.移除链表元素-简单题目链接:707.设计链表-中等题目链接:206.反转链表-简单题目链接:203.移除链表元素-简单题目描述:给你一个链表的头节点head和一个整数val,请你删除链表中所有满足Node.val==val的节点,并返回新的头节点。示例1:输入:head=[1,2,6......
  • 【leetcode】数组篇刷题 --删除元素
    //@before-stub-for-debug-begin#include<vector>#include<string>#include"commoncppproblem27.h"usingnamespacestd;//@before-stub-for-debug-end/**@lcapp=leetcode.cnid=27lang=cpp**[27]移除元素*///@lccode=start......
  • Leetcode刷题第十二天-动态规划
    1049:最后一块石头的重量II链接:1049.最后一块石头的重量II-力扣(LeetCode)1classSolution:2deflastStoneWeightII(self,stones:List[int])->int:3#dp[i]背包为i的最大价值为dp[i]4#推导公式dp[i]=max(dp[i],dp[i-stones[i]]+stones[i]......
  • 链表
    链表特性通过每个结点记录之后或之前结点的值,那么就可以知道所有结点的排列顺序。插入如果要在链表中插入一个元素。那么就可以将前面的元素的后缀(指的是之后结点的值)改成插入的元素,插入元素的后缀顶上前面元素的后缀。voidinsret(intx,inty){ nxet[y]=next[x]; next[......
  • 力扣递归之 236. 二叉树的最近公共祖先
    给定一个二叉树,找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树T的两个节点p、q,最近公共祖先表示为一个节点x,满足x是p、q的祖先且x的深度尽可能大(一个节点也可以是它自己的祖先)。” 示例1:输入:root=[3,5,1,6,2,0,8,null,n......
  • 力扣 dfs之 437. 路径总和 III
    给定一个二叉树的根节点root ,和一个整数targetSum,求该二叉树里节点值之和等于targetSum的路径的数目。路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。 示例1:输入:root=[10,5,-3,3,2,null,11,3,-2,null,1],target......
  • 刷题记录_2024寒假2/19~2/21
    P4287[SHOI2011]双倍回文考虑马拉车,但是我不会马拉车怎么办,考虑PAM我们在记录一般的fail之外再记录一个trans指针指向小于等于当前节点长度一半的最长回文后缀然后枚举每个节点#include<bits/stdc++.h>usingnamespacestd;chars[2000001];intlen[2000001],trans[2000......
  • Leetcode刷题第十天-动态规划
    ......
  • 2024-02-19-物联网C语言(9-链表)
    9.链表9.1概念假如:做一个班级信息管理系统,统计班级学生的信息而我们事先不知道班级人数,或者知道人数,但是中间人员可能发生变化:比如有新同学加入,有同学请假,又或者我们需要统计班级的平均成绩等等目标:要做一个类似QQ、飞秋类似的通信软件,其中有一个功能,类似用户上下线检测、......
  • Java实现静态链表
    本文参照了大话数据结构的静态链表的c语言实现packagecom.luoyi.list;/***@Description静态链表*@AuthorLuoyi*@Date2024/2/19**注:1.索引为0的节点不存放数据,cur指向第一个空闲节点的下标*2.最后一个元素(即下标Maxsize-1)的cur指向第一个有效数......