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

单链表中的递归算法

目录

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.kler.cn/a/598102.html

相关文章:

  • 【C++教程】bool类型
  • Rust语言的集成测试
  • 数据库数值函数详解
  • 浅谈布隆过滤器(Bloom Filter)
  • 基于CNN-LSTM联合网络的主瓣干扰辨识
  • java开发人工智能问答小项目
  • 关于大数据的基础知识(三)——数据安全与合规
  • 平芯微PW5012应用电路
  • Codeforces Round 1012 (Div. 2) 3.23
  • 个人学习编程(3-23) leetcode刷题
  • 音频变压器技术白皮书
  • uniapp的app产物如何打成apk
  • Spring Boot(十六):拦截器Interceptor
  • ScheduledThreadPoolExecutor 延迟任务执行原理以及小顶堆的应用(源码)
  • 运维智能体的可行性研究
  • 图解AUTOSAR_SWS_IPDUMultiplexer
  • 多个内容滑动轮播图【前端】
  • 算法训练营第二十二天 | 回溯算法(四)
  • A2O MAY首支单曲《Under My Skin(A2O)》成功打入美国“MediaBase主流电台榜单”,中国女团首次登榜
  • C#控制台应用程序学习——3.23