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

算法学习 递归

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); } }
http://www.cnnetsun.cn/news/15880.html

相关文章:

  • AI帮你做跨境!DeepBI助力亚马逊广告新手卖家实现质的飞跃
  • LCD字模工具终极对比:3款神器如何选择?
  • 终极收藏版:2025年最值得合作的GEO公司推荐,技术实力大揭秘!
  • QARM:多模态语义对齐与量化在推荐系统中的实践路径
  • AI 省钱双 buff:价格优化 + 优惠整合,省到实处
  • 用1/10的成本跑RAG?向量压缩+模型蒸馏+智能缓存实战指南
  • 毕业设计实战:基于SpringBoot+MySQL的机动车号牌管理系统,从0到1避坑全流程,导师都说稳!
  • 高密度互联:连接AI“积木”的精密桥梁
  • 2025十大项目管理工具揭晓:从轻量协作到企业级方案全解析
  • 26Java基础之特殊文本文件、日志技术
  • AI投喂Geo优化系统哪家经验丰富?深度解析行业领先服务商
  • 专业的煤矿水仓清淤公司
  • GPT-5.2 的数据基石、原生多模态与隐私承诺
  • 16、Lotus Domino 6在Linux系统中的数据备份与安全保障
  • Hikari-LLVM15终极指南:5个实战场景掌握代码混淆技术
  • 如何快速解决OpenVLA模型微调后推理中的动作归一化问题
  • 故障注入测试:构建高韧性系统的工程实践
  • WinSetView终极指南:如何快速统一Windows文件夹视图设置
  • ImageGPT技术解析:像素序列预测如何重构视觉AI底层架构
  • Beyond Compare 5 密钥生成完整指南:从原理到实战应用
  • 手艺人札记:在开源系统中重塑技术的温度
  • 5种方法彻底解决番茄小说离线下载难题
  • 史诗级漏洞警报:ASP.NET Core 被曝 CVSS 9.9 分漏洞,几乎所有.NET 版本无一幸免!
  • Cider音乐播放器终极指南:跨平台Apple Music体验全解析
  • 力扣刷题:最大子数组和
  • ⭐力扣刷题:岛屿数量
  • Screenbox媒体播放器:深度解析Windows平台的现代播放解决方案
  • 5步重构OpenSTM扫描隧道显微镜项目架构
  • DXVK终极配置手册:Linux游戏性能优化的完整解决方案
  • 活字格低代码平台:企业数字化转型的技术架构与实践剖析