当前位置: 首页 > 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;
    }
};
http://www.dtcms.com/a/85666.html

相关文章:

  • 编译原理——词法分析
  • 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库的安装与使用
  • 《当人工智能遇上广域网:跨越地理距离的通信变革》
  • 08_双向循环神经网络
  • React 中useMemo和useCallback Hook 的作用,在什么场景下使用它们?
  • 图书管理系统系统-Java、SpringBoot、Vue和MySQL开发的图书馆管理系统
  • 文心快码 使用体验与介绍
  • 分布式算法:Paxos Raft 两种共识算法
  • 结合代码理解Spring AOP的概念(切面、切入点、连接点等)
  • Rocky Linux 软件安装:Last metadata expiration check:
  • leetcode_双指针 15.三数之和
  • 【前端扫盲】liquid模板语言
  • css重点知识汇总(二)