news 2026/4/15 9:11:39

算法学习 递归

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
算法学习 递归

1.合并两个有序链表

将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例 1:

输入:l1 = [1,2,4], l2 = [1,3,4]输出:[1,1,2,3,4,4]

示例 2:

输入:l1 = [], l2 = []输出:[]

示例 3:

输入:l1 = [], l2 = [0]输出:[0]
/** * 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 list1, ListNode list2) { if(list1==null){ return list2; } else if(list2==null){ return list1; }else if(list1.val<list2.val){ list1.next = mergeTwoLists(list1.next,list2); return list1; }else{ list2.next = mergeTwoLists(list1,list2.next); return list2; } } }

2.两两交换链表中的节点

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

示例 1:

输入:head = [1,2,3,4]输出:[2,1,4,3]

示例 2:

输入:head = []输出:[]

示例 3:

输入:head = [1]输出:[1]
/** * 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 swapPairs(ListNode head) { // // 递归终止条件:链表为空 或 只剩一个节点,无法交换,直接返回原节点 // if (head == null || head.next == null) { // return head; // } // // cur 是当前链表中第二个节点(交换后会成为新的头节点) // ListNode cur = head.next; // // 递归处理 cur.next 开始的剩余链表,返回的结果作为原头节点的后继 // head.next = swapPairs(cur.next); // // 交换当前两个节点:cur 指向原头节点 head // cur.next = head; // // 返回交换后的新头节点 cur // return cur; //非递归 ListNode pre = new ListNode(0);//定义一个虚拟头结点 pre.next = head; ListNode temp = pre; while(temp.next!=null&&temp.next.next!=null){ ListNode start = temp.next; ListNode end = temp.next.next; temp.next = end; // 步骤1:前驱节点指向第二个节点 start.next = end.next; // 步骤2:第一个节点指向第二个节点的后继 end.next = start; // 步骤3:第二个节点指向第一个节点 temp = start; // 步骤4:移动temp到交换后的第一个节点(下一轮的前驱) } return pre.next; } }

3.重排链表

给定一个单链表L的头节点head,单链表L表示为:

L0 → L1 → … → Ln - 1 → Ln

请将其重新排列后变为:

L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …

不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

示例 1:

输入:head = [1,2,3,4]输出:[1,4,2,3]

示例 2:

输入:head = [1,2,3,4,5]输出:[1,5,2,4,3]
/** * 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 void reorderList(ListNode head) { if(head==null||head.next==null||head.next.next==null){ return; } // 找到倒数第二个节点(prev)和最后一个节点(tail) ListNode prev = head; while(prev.next.next!=null){ prev=prev.next; } ListNode tail = prev.next; //断开连接 prev.next=null; //保留下一个节点 ListNode nextNode = head.next; head.next=tail; tail.next = nextNode; //递归 reorderList(nextNode); } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/14 17:32:59

OpenPose安装指南:5步轻松实现人体姿态检测

OpenPose安装指南&#xff1a;5步轻松实现人体姿态检测 【免费下载链接】openpose 项目地址: https://gitcode.com/gh_mirrors/op/openpose 想要快速上手OpenPose这个强大的人体姿态估计工具吗&#xff1f;作为业界领先的开源项目&#xff0c;OpenPose能够精准识别人体…

作者头像 李华
网站建设 2026/4/13 11:03:03

什么是软件负载测试

负载测试是性能测试的一种类型&#xff0c;用于评估系统在特定负载条件下的表现。其核心目标是验证系统在预期或更高负载下能否维持稳定的性能指标&#xff08;如响应时间、吞吐量、资源利用率等&#xff09;。 核心特征模拟真实场景 通过工具&#xff08;如 JMeter、LoadRunne…

作者头像 李华
网站建设 2026/4/6 14:09:59

大模型从0到精通:错题本与得分卡 —— AI如何知道自己“错”了?

本文是《大模型从0到精通》系列第一卷“奠基篇”的第二章。上章我们找到了预测直线,但怎么知道这条线是“好”是“坏”?本章将引入损失函数——AI的“错题本”与“得分卡”,让你理解AI如何量化自己的错误,为后续的优化学习奠定基础。 一、从“感觉差不多”到“数字评分” …

作者头像 李华
网站建设 2026/4/9 10:58:17

LabVIEW完整部署指南:从零开始掌握图形化编程

LabVIEW作为美国国家仪器&#xff08;NI&#xff09;公司开发的革命性图形化编程环境&#xff0c;彻底改变了传统文本编程的模式。本指南将带领您完成LabVIEW的全生命周期管理&#xff0c;从准备工作到日常使用的完整流程。 【免费下载链接】LabVIEW下载安装和谐与卸载教程 Lab…

作者头像 李华
网站建设 2026/4/11 19:57:43

Uvicorn 全面教程:常用 API 串联与实战指南

大家好&#xff0c;我是jobleap.cn的小九。 Uvicorn 是一款闪电般快速的 ASGI&#xff08;Asynchronous Server Gateway Interface&#xff09;服务器&#xff0c;专为 Python 异步 Web 应用设计&#xff0c;是 FastAPI、Starlette 等主流异步 Web 框架的标配运行时。相较于传统…

作者头像 李华
网站建设 2026/4/12 14:20:20

如何用新榜小豆芽解决自媒体团队最头疼的3大难题?

对于正在规模化运营的自媒体团队而言&#xff0c;账号增长带来的不仅是影响力&#xff0c;更是一系列具体而棘手的运营难题。团队负责人最近就面临三个典型困境&#xff1a;“账号越添越多&#xff0c;管理越来越乱”、“矩阵做大了&#xff0c;总担心被封号”、“团队人多了&a…

作者头像 李华