当前位置: 首页 > news >正文

单链表中的递归算法

目录

1.合并两个有序链表

2.反转链表

3.两两交换链表中的结点


1.合并两个有序链表

题目描述:

题目分析:

  • 大问题:合并两个升序链表
  • 策略:选出最小的结点,将剩下的部分和另一个链表拼接
  • 子问题:合并剩下的部分和另一个升序链表
  • 策略:选出最小的结点,将剩下的部分和另一个链表拼接

解决问题:

  • 递归函数:ListNode* dfs(ListNode* list1, ListNode* list2);
  • 函数功能:拼接两个升序链表。

题目链接:21. 合并两个有序链表 - 力扣(LeetCode)

代码示例:

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
        return dfs(list1, list2);
    }

    ListNode* dfs(ListNode* list1, ListNode* list2)
    {
        if(!list1) return list2;
        if(!list2) return list1;

        ListNode* ret = nullptr;

        if(list1->val <= list2->val)
        {
            ret = list1;
            ret->next = dfs(list1->next,list2);
        }
        else
        {
            ret = list2;
            ret->next = dfs(list2->next,list1);
        }

        return ret;
    }
};

2.反转链表

题目描述:

题目分析:

  • 大问题:逆置n个节点的单链表
  • 策略:逆置后面的n-1个节点,然后再和第一个逆置
  • 子问题:逆置后面的n-1个节点
  • 策略:逆置后面的n-2个节点,然后再和第二个逆置

解决问题:

  • 递归函数:ListNode* dfs(ListNode* list)
  • 功能:逆置list链表,并返回逆置之后最后一个结点的指针。

题目链接:206. 反转链表 - 力扣(LeetCode)

代码示例:

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if(!head)
            return nullptr;

        return dfs(head);
    }

    // 逆置单链表
    ListNode* dfs(ListNode* list)
    {
        if(list->next == nullptr)
        {
            return list;
        }

        ListNode* ret = dfs(list->next);
        list->next->next = list;
        list->next = nullptr;
        return ret;
    }
};

3.两两交换链表中的结点

题目描述:

题目分析:

  • 大问题:两两交换整个链表
  • 策略:除了前两个结点,两两交换剩余的节点
  • 子问题:两两交换剩余的结点
  • 策略:除了前两个结点,两两交换剩余的结点

解决问题:

  • 递归函数:ListNode* dfs(ListNode* head);
  • 功能:两两交换head链表中的结点

题目链接:https://leetcode.cn/problems/swap-nodes-in-pairs/

代码示例:

class Solution {
public:
    ListNode* swapPairs(ListNode* head)
    {
        return dfs(head);
    }

    ListNode* dfs(ListNode* head)
    {
        if(!head || !head->next)
        {
            return head;
        }

        ListNode* tmp = dfs(head->next->next);
        ListNode* ret = head->next; // 先保存一下要返回的节点
        head->next->next = head;
        head->next = tmp;

        return ret;
    }
};

相关文章:

  • 编译原理——词法分析
  • GD32 ARM单片机开发规范检查清单 GD32嵌入式C代码检查清单
  • 《TypeScript 类的艺术:高效编码指南》
  • TransformersInternLM源码阅读
  • 括弧匹配检验(信息学奥赛一本通-1354)
  • Cherry Studio搭建本地知识库,结合DeepSeek实现RAG
  • AM32-MultiRotor-ESC项目固件编译和烧录方法介绍
  • 【Spring】Spring框架介绍
  • C/C++蓝桥杯算法真题打卡(Day7)
  • 生物化学笔记:医学免疫学原理03 超抗原+丝裂原+疫苗佐剂
  • BLE 4.0开发技术全景解析
  • [自动化] 【八爪鱼】使用八爪鱼实现CSDN文章自动阅读脚本
  • (自用)在派上设置自启动时的问题
  • 0323-哈夫曼数、哈夫曼编码
  • proteus仿真stm32f103c8程序运行不起来的问题分析与解决
  • Jboss漏洞再现
  • C51知识点
  • 代码随想录算法训练营第十五天|右旋字符串
  • Linux的文件上传下载的lrzsz库的安装与使用
  • 《当人工智能遇上广域网:跨越地理距离的通信变革》
  • 家政阿姨如何炼成全国劳模?做饭、收纳、养老、外语样样都会
  • 马上评|扩大高速免费救援范围,打消出行后顾之忧
  • 聚焦各领域顶尖工匠,《上海工匠》第十季于五一播出
  • 辽宁辽阳市白塔区一饭店发生火灾,当地已启动应急响应机制
  • 媒体:黑话烂梗包围小学生,“有话好好说”很难吗?
  • 中行一季度净赚超543亿降2.9%,利息净收入降逾4%