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

算法题(链表)

一、题目

1、两两交换链表中的节点(LC 24)

2、删除链表的倒数第N个节点(LC 19)

3、两数相加(LC 2)

二、题解

1、两两交换链表中的节点(LC 24)

(1)分析

可以使用迭代法解决。遍历链表时,对于每一组需要交换的节点,同时操作前驱节点、当前节点、后继节点三者的指针指向,才能完成交换,避免链表断裂。具体来说:先让当前节点指向后继节点的下一个节点,再让后继节点回指当前节点,最后让前驱节点指向新的头部节点,完成一组交换。

需要创建哨兵节点 dummy,用来固定新链表的头节点位置 —— 因为两两交换会直接改变原链表的头节点,原 head 指针会指向第二个节点,无法作为结果返回。迭代过程遍历链表一次,每个节点仅访问一次。时间复杂度为 O (n),空间复杂度为 O (1)。

(2)解答
/** * 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)return null; ListNode dummy = new ListNode(0); //哨兵节点,方便返回结果 dummy.next = head; ListNode curr = head; //当前节点 ListNode pre = dummy; //当前节点前一个节点 while(curr != null && curr.next != null){ ListNode next = curr.next; //当前节点后一个节点 curr.next = next.next; // next.next = curr; //改变指针朝向,交换位置 pre.next = next; // pre = curr; //更新前驱节点 curr = curr.next; //更新当前节点。已经后继结点交换位置了,只需要再向后移动一次 } return dummy.next; } }

2、删除链表的倒数第N个节点(LC 19)

(1)分析

采用快慢双指针解决。首先创建哨兵节点作为整个链表的虚拟头节点,让它指向原头节点,再定义快指针 start 和慢指针 end 都指向哨兵节点。

第一步先让快指针单独向前移动 n 步,使快慢指针之间保持固定的 n 个节点间距;第二步让快慢指针同步向后移动,直到快指针到达链表末尾。此时慢指针恰好指向待删除节点的前驱节点,直接修改前驱节点的指针指向 end.next = end.next.next,即可跳过并删除目标节点。

由于待删除节点可能是原链表的头节点,head 指针会失效,因此最终必须返回哨兵节点的后继节点,不能直接返回 head。时间复杂度为 O (n),空间复杂度为 O (1)。

(2)解答
/** * 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 removeNthFromEnd(ListNode head, int n) { ListNode pre = new ListNode(0); pre.next = head; ListNode start = pre, end = pre; while(n>0){ start = start.next; n--; } while(start.next != null){ start = start.next; end = end.next; } end.next = end.next.next; return pre.next; } }

3、两数相加(LC 2)

(1)分析

链表从头部到尾部对应数字的低位到高位。遍历两个链表时,自动对齐位数:若一个链表已遍历完毕,则对应位用 0 补充。每一轮计算当前位的和(两个节点值 + 上一轮进位),用取余 sum%10 得到当前位的结果存入新节点,用取整 sum/10 更新进位值。循环遍历直到两个链表都为空。

使用哨兵节点指向新链表的头节点,避免空指针判断,最后直接返回哨兵节点的后继节点作为结果链表头。时间复杂度为 O (max (n,m)),空间复杂度为 O (max (n,m)。

(2)解答
/** * 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 addTwoNumbers(ListNode l1, ListNode l2) { ListNode pre = new ListNode(0); ListNode curr = pre; int flag = 0; while(l1!=null || l2!=null){ int x = l1 == null ? 0 : l1.val; int y = l2 == null ? 0 : l2.val; int sum = x + y + flag; flag = sum / 10 ; sum = sum % 10; ListNode node = new ListNode(sum); curr.next = node; curr = curr.next; if(l1 != null)l1 = l1.next; if(l2 != null)l2 = l2.next; } if(flag == 1){ ListNode node = new ListNode(1); curr.next = node; } return pre.next; } }
http://www.jsqmd.com/news/754374/

相关文章:

  • 告别pip安装失败:为ARM64嵌入式设备手动编译PyQt5和SIP的保姆级指南
  • 告别低效调试:用快马平台为openclaw onboard打造一体化视觉与运动规划调试工具
  • 初创团队如何借助Taotoken实现敏捷的AI能力集成与成本控制
  • 别再乱选了!Vivado 2023.1添加文件夹时,‘Scan RTL’和‘Add from Subdirs’到底怎么用?附实例对比
  • 电容传感技术:CSR与CSA架构对比与优化实践
  • 液压执行器安全强化学习力控制技术解析
  • C++ DoIP协议栈集成失败?5大高频配置错误及3步热修复方案(实测覆盖Vector CANoe/Divya/ETAS工具链)
  • Visual C++运行库终极指南:一键解决Windows程序启动失败问题
  • AI智能体记忆守护进程:架构设计与工程实践指南
  • 基于PDSA循环的AI科学教育视频生成系统设计与实践
  • 自托管知识库pm-wiki-v1:产品经理的Wiki系统设计与Docker部署实践
  • 不止于驱动:我把ThinkBook 14+改造成了Ubuntu‘完全体’(加装AX210网卡、1T固态与指纹模块实录)
  • 10G以太网技术演进与核心特性解析
  • 为什么92%的SIL2认证项目因C++构造函数顺序失败?:基于37个核电/轨交项目审计数据的功能安全初始化链路建模方法
  • 从GSM手机到物联网:GMSK调制为何至今仍是低功耗无线通信的宠儿?
  • 为什么“未尽潜力”的不安感,不是失败,而是现代高标准创作者的钻石压力场
  • Super Dev:AI编码助手的工程化教练系统,实现稳定项目交付
  • 面试官问‘如何解析算式字符串’?用逆波兰表达式(后缀表达式)在C++里优雅搞定
  • 无需手动搜索,用快马ai一键生成pycharm安装配置指南原型
  • AsyncStreamConcurrencyOptions全参数详解,从MaxDegreeOfParallelism到BufferLimit——.NET团队未文档化的4个隐藏行为
  • 告别手动处理!用Matlab脚本批量提取MDF信号,一键生成Simulink输入
  • 量子计算开发者最后的C++防线:仅存3套开源合规框架清单(含FIPS 140-3认证状态)
  • 单目视频3D追踪技术解析与应用实践
  • 《纪·念》——给时间里的三次凝视
  • 汽车以太网诊断迫在眉睫!C++ DoIP开发工程师紧急进阶课:3天掌握DoIP+UDS+Secure Boot联合调试
  • 光流与多模态大模型在运动图像编辑中的应用
  • 别再瞎猜K值了!用Python实战Elbow和Silhouette Score,5分钟搞定K-Means最佳聚类数
  • 设计师福音:Gemini3.1Pro一键生成专业设计规范
  • OpenClaw Smart Agent:单机多智能体编排工具包的设计与实战
  • 深耕GEO抢占智能搜索红利