当前位置: 首页 > 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库的安装与使用
  • 《当人工智能遇上广域网:跨越地理距离的通信变革》
  • 论法的精神︱张玉敏:知识产权保护要为社会经济文化发展服务
  • 古籍新书·2025年春季|中国土司制度史料集成
  • 上海浦东单价超10万楼盘228套房源开盘当天售罄,4月已有三个新盘“日光”
  • 仲裁法修订草案二审稿拟增加规定规制虚假仲裁
  • 伊朗港口爆炸致18死800余伤,三分之二伤者已出院
  • 同款瑞幸咖啡竟差了6元,开了会员仍比别人贵!客服回应