首页 > 编程语言 >(算法)合并两个有序链表————<递归>

(算法)合并两个有序链表————<递归>

时间:2024-07-22 12:26:38浏览次数:16  
标签:结点 ListNode 递归 val list1 next 链表 算法

1. 题⽬链接:21.合并两个有序链表 

2. 题⽬描述:

 

3. 解法(递归):

算法思路:

1. 递归函数的含义:交给你两个链表的头结点,你帮我把它们合并起来,并且返回合并后的头结点;

2. 函数体:选择两个头结点中较⼩的结点作为最终合并后的头结点,然后将剩下的链表交给递归函数 去处理;

3. 递归出⼝:当某⼀个链表为空的时候,返回另外⼀个链表。

注意注意注意:链表的题⼀定要画图,搞清楚指针的操作!  

 C++算法代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution 
{
public:
    //对比两个链表
    ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) 
    {
        //为空时返回另一个链表
        if(list1==nullptr)
        {
            return list2;
        }
        if(list2==nullptr)
        {
            return list1;
        }
        //如果链表1的头结点<=链表2的头结点,链表1的后续节点在后续两个链表中比较取最小值
        if(list1->val<=list2->val)
        {
            list1->next=mergeTwoLists(list1->next,list2);
            return list1;
        }
        //如果链表2的头结点<=链表1的头结点,链表2的后续节点在后续两个链表中比较取最小值
        else
        {
            list2->next=mergeTwoLists(list2->next,list1);
            return list2;
        }
    }
};

Java算法代码:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 * int val;
 * ListNode next;
 * ListNode() {}
 * ListNode(int val) { this.val = val; }
 * ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution 
{
 public ListNode mergeTwoLists(ListNode l1, ListNode l2) 
 {
 if(l1 == null) return l2;
 if(l2 == null) return l1;
 if(l1.val <= l2.val)
 {
 l1.next = mergeTwoLists(l1.next, l2);
 return l1;
 }
 else
 {
 l2.next = mergeTwoLists(l1, l2.next);
 return l2;
 }
 }
}

标签:结点,ListNode,递归,val,list1,next,链表,算法
From: https://blog.csdn.net/2301_79580018/article/details/140606441

相关文章

  • (算法)汉诺塔————<递归>
    1.题⽬链接:329.矩阵中的最⻓递增路径 2.题⽬描述:3.解法(暴搜->记忆化搜索):算法思路:这是⼀道递归⽅法的经典题⽬,我们可以先从最简单的情况考虑:•假设n=1,只有⼀个盘⼦,很简单,直接把它从A中拿出来,移到C上;•如果n=2呢?这时候我们就要借助B了,因为⼩盘⼦必须时刻都在⼤盘......
  • 数据结构与算法从淬体到元婴day04之堆
    堆堆的定义堆是一种特殊的完全二叉树结构,其每个节点的值都遵循一定的堆属性。堆在物理上是通过数组实现的,逻辑上则表现为树形结构。堆的性质堆总是一棵完全二叉树。堆中某个节点的值总是不大于(最大堆)或不小于(最小堆)其父节点的值。将根节点最大的堆称为最大堆或大根堆,根节点......
  • 算法原理-Music
    应用DOA估计原理MUSIC算法,叫做多信号分类算法(MultipleSignalClassification),是一种基于特征结构的高分辨率DOA算法。该算法利用了信号子空间和噪声子空间正交性的特点,构造噪声空间然后通过谱峰搜索来检测信号的波达方向。需要注意的是,该算法有一个前提,即各个入射信号之间互......
  • PCL使用贪婪三角形算法曲面重构
    内容介绍贪婪投影三角化算法是一种对原始点云进行快速三角化的算法,该算法假设曲面光滑,点云密度变化均匀,不能在三角化的同时对曲面进行平滑和孔洞修复。方法:(1)将三维点通过法线投影到某一平面(2)对投影得到的点云作平面内的三角化(3)根据平面内三位点的拓扑连接关系获得一个......
  • 【数学】【模板】扩展欧几里得算法
    扩展欧几里得算法思想首先回忆一下裴蜀定理:对于任意一对不全为\(0\)的整数\(a,b\),存在\(x,y\)使得\(ax+by=\gcd(a,b)\)。扩展欧几里得算法就是求出一组解满足\(ax+by=\gcd(a,b)\),这里用到了欧几里得算法,不会的,可以看看我的博客。我们看看怎么求:当\(b=......
  • 【数学】【模板】欧几里得算法
    欧几里得算法思想\[\gcd(a,b)=\gcd(b,a\bmodb)\]证明\(\gcd(a,b)=\gcd(b,a\bmodb)\):首先,如果有\(d|a\),\(d|b\),那么\(d|ax+by\)。然后,\(a\bmodb=a-\left\lfloor\dfrac{a}{b}\right\rfloorb\)。假设\(p=\gcd(a,b)\),那么\(p|......
  • 【搜索】【模板】A* 算法
    学了IDA*,然后学学A*。A*A*可以简单理解为在bfs的时候分个先后,哪个最有可能先到达就先走哪一步。A*是在某个最短路问题中(比如求最小的步骤等),如果所有边权都是非负的,那么就可以使用启发函数来优化bfs过程。例题P1379八数码难题思路我们在bfs的过程中加入函数\(h......
  • 算法学习(算法笔记胡凡)
    目录考生排序递归问题数塔问题回文字符串棋盘覆盖问题盒分形自然数分解之最大积自然数分解之方案数01串STL练习迭代器的使用考生排序https://sunnywhy.com/sfbj/4/1/92结构体的使用,sort函数的使用递归问题数塔问题https://sunnywhy.com/sfbj/4/3/116动态规划问题dp例如给......
  • 洛谷算法题
    目录数字反转迪杰斯特拉算法背包问题字符串排序P1192台阶问题P1111修复公路炸铁路问题计数问题......
  • 即使通过了示例测试用例,Dijkstra 算法也不起作用
    所以我遵循了维基百科关于Dijkstra算法和Brilliants的伪代码。https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm#Pseudocodehttps://brilliant.org/wiki/dijkstras-short-路径查找器/这是我的代码,它不起作用。谁能指出我的代码中的缺陷吗?#Usespyt......