news 2026/3/22 13:27:54

算法学习 递归

作者头像

张小明

前端开发工程师

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/3/12 23:16:14

BDD100K数据集:一站式计算机视觉训练解决方案

BDD100K数据集&#xff1a;一站式计算机视觉训练解决方案 【免费下载链接】BDD100K数据集下载仓库 BDD100K数据集下载仓库本仓库提供BDD100K数据集的下载资源&#xff0c;包含所有的训练集和测试集&#xff0c;以及darknet文件&#xff0c;可以直接用于训练 项目地址: https:…

作者头像 李华
网站建设 2026/3/13 0:35:09

InstantID零基础入门:一键生成跨年龄人脸图像终极指南

你是否想象过自己20岁时的青春模样&#xff0c;或是好奇60岁时的睿智风采&#xff1f;现在&#xff0c;借助InstantID的强大AI技术&#xff0c;这一切都变得触手可及。无需任何编程经验&#xff0c;只需一张照片&#xff0c;就能快速生成跨越数十年的真实人脸图像&#xff0c;让…

作者头像 李华
网站建设 2026/3/13 1:02:18

如何使用JMeter对系统进行多场景负载测试

以下是使用 JMeter 进行电商系统购物车多场景负载测试的详细步骤和脚本说明。测试场景比例设置为&#xff1a;添加商品&#xff08;30%&#xff09;、浏览商品&#xff08;50%&#xff09;、结算操作&#xff08;20%&#xff09;。1. 测试目标 模拟真实用户行为&#xff0c;验证…

作者头像 李华
网站建设 2026/3/14 4:30:42

集结完毕,COSCon‘25 开源集市伙伴正式亮相!

COSCon25 第十届中国开源年会&#xff0c;将于 2025 年 12 月 6-7 日&#xff0c;在北京市海淀区丽亭华苑酒店举办。HyperAI超神经作为联合出品社区在现场设置了展位&#xff0c;为大家准备趣味活动与精美礼品&#xff0c;欢迎大家来玩&#xff01; COSCon25 第十届中国开源年会…

作者头像 李华
网站建设 2026/3/21 18:27:30

专业的深圳AI营销公司

专业的深圳AI营销公司&#xff1a;深圳市语料文化科技有限公司引言在当今数字化时代&#xff0c;人工智能(AI)技术正在深刻改变各行各业的运作方式。特别是在营销领域&#xff0c;AI的应用已经从简单的数据分析发展到更复杂的生成式AI&#xff0c;为企业提供更加精准和个性化的…

作者头像 李华