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

算法日记 - Day8

两数相加

使用指针,分别遍历两个链表同位置的数,计算两数以及前面的进位值的和,如果值 > 10,那么进位 1,如此循环。

classSolution{publicListNodeaddTwoNumbers(ListNodel1,ListNodel2){ListNodehead=newListNode();ListNodecur=head;intcarry=0;while(l1!=null||l2!=null||carry!=0){intval=0;val+=l1==null?0:l1.val;val+=l2==null?0:l2.val;val+=carry;cur.next=newListNode(val%10);cur=cur.next;carry=val/10==0?0:1;l1=l1!=null?l1.next:null;l2=l2!=null?l2.next:null;}returnhead.next;}}

因为最后l1l2都为null之后可能还有一个进位,所以还要再往前多算一次

删除链表中的节点


classSolution{publicvoiddeleteNode(ListNodenode){node.val=node.next.val;node.next=node.next.next;}}

这个还给到中等难度…

删除链表的倒数第 N 个结点

classSolution{publicListNoderemoveNthFromEnd(ListNodehead,intn){ListNodedummy=newListNode(0,head);ListNodecur,pre;cur=pre=dummy;// cur 先走 n 步while(n--!=0){cur=cur.next;}// 一块走while(cur.next!=null){cur=cur.next;pre=pre.next;}pre.next=pre.next.next;// 删除,利用 Java 自己的垃圾回收,只要没人指向它就回收了returndummy.next;}}

两两交换链表中的节点

如果能修改值交换可太方便了,嘿嘿

节点交换的示意图如下

classSolution{publicListNodeswapPairs(ListNodehead){ListNodedummy=newListNode(0,head);ListNodepre=dummy,cur=dummy.next;// cur 指向交换时的第一个结点,pre.next 指向 curwhile(cur!=null&&cur.next!=null){ListNodenxt=cur.next;pre.next=nxt;cur.next=nxt.next;nxt.next=cur;// 注意 cur 和 nxt 交换了,现在 nxt 在 cur 前面pre=cur;cur=cur.next;}returndummy.next;}}

随机链表的复制



只考虑next还好,但是有 random 就不知道它指向谁了,有可能指向我们还没创建的节点,所以我的思路是把所有的节点先创建好,这样旧链表节点和新链表节点能够一一对应起来

classSolution{publicNodecopyRandomList(Nodehead){if(head==null)returnnull;Map<Node,Node>mp=newHashMap<>();Nodecur=head;// 先创建好新链表while(cur!=null){mp.put(cur,newNode(cur.val));cur=cur.next;}cur=head;// 依次赋值每个节点的 next 和 randomwhile(cur!=null){NodenewCur=mp.get(cur);// 可能指向 null,所以取不到设置默认值newCur.next=mp.getOrDefault(cur.next,null);newCur.random=mp.getOrDefault(cur.random,null);cur=cur.next;}returnmp.get(head);}}

不用哈希表怎么做?这我自己想不到,我是抄灵神作业

例如链表 1→2→3,依次复制每个节点(创建新节点并复制 val 和 next),把新节点直接插到原节点的后面,形成一个交错链表:
1 → 1 ′ → 2 → 2 ′ → 3 → 3 ′ 1→1'→2→2'→3→3'112233

如此一来,原链表节点的下一个节点,就是其对应的新链表节点了!

然后遍历这个交错链表,假如节点 1 的 random 指向节点 3,那么就把新节点 1′
的 random 指向节点 3 的下一个节点 3′,这样就完成了对 random 指针的复制。最后,从交错链表中分离出 1′→2′→3′,即为深拷贝后的链表。

⚠注意:不能只删除节点 1,2,3,因为题目要求原链表的 next 不能修改。

classSolution{publicNodecopyRandomList(Nodehead){// 复制每个节点,把新节点直接插到原节点的后面for(Nodecur=head;cur!=null;cur=cur.next.next){cur.next=newNode(cur.val,cur.next);}// 遍历交错链表中的原链表节点for(Nodecur=head;cur!=null;cur=cur.next.next){if(cur.random!=null){// 要复制的 random 是 cur.random 的下一个节点cur.next.random=cur.random.next;}}// 把交错链表分离成两个链表Nodedummy=newNode(0);Nodetail=dummy;for(Nodecur=head;cur!=null;cur=cur.next,tail=tail.next){Nodecopy=cur.next;// 新节点tail.next=copy;// 把新节点插在 tail 的后面,构建新的链表cur.next=copy.next;// 恢复原节点的 next}returndummy.next;}}
http://www.jsqmd.com/news/1334430/

相关文章:

  • 如何3步搞定在线视频下载:N_m3u8DL-RE完整指南
  • ViGEmBus终极指南:解决Windows虚拟游戏控制器常见问题
  • BilibiliDown音频提取指南:从B站视频轻松获取无损音乐
  • 终极指南:如何用XSwitch快速解决Chrome跨域调试难题
  • MAIGateway,魔芋企业级AI网关的FinAPI成本竞争力设计
  • Proxmark3企业级实战:NFC安全认证深度解析与配置指南
  • 本地电脑自动化 OpenClaw,安装踩坑汇总与故障排查实操分享(含安装包)
  • KMS_VL_ALL_AIO:重新定义Windows和Office激活体验的智能解决方案
  • 5分钟搞定Windows虚拟显示器:零成本扩展你的数字工作空间
  • 潍坊正规配镜门店靠谱推荐 - 百航
  • 温州代理记账公司哪家好?2026年8月Top**推荐 - 品牌帮
  • Audacity音频编辑神器:3个真实场景教你从零到专业创作
  • Qt 通用pro配置
  • 不同网络连接模式下kali虚拟机的IP
  • 5分钟掌握PKHeX.Mobile:移动端宝可梦存档编辑终极指南
  • 终极Switch控制器兼容方案:MissionControl解锁全平台游戏体验
  • 为什么angular-chosen-localytics是AngularJS项目的必备下拉插件?5大核心优势揭秘
  • 如何快速获取B站视频完整评论数据:Python爬虫终极指南
  • 服装辅料点钻工艺精度衰减问题研究:多引擎自适应控制方案实测分析
  • 三步搞定Mac鼠标指针个性化:让MacBook的鼠标指针变得有趣又实用
  • storcli安装和使用方法
  • 海牙公证认证在哪里办理?**渠道、线上线下流程全解! - 指上通
  • Java类加载过程详解与示例
  • 2026年河北护栏螺栓批发 解决规格适配 靠谱厂家推荐 - 产品推荐官
  • 为什么精准灌溉能决定作物收成
  • Bebas Neue终极指南:免费开源标题字体完全手册
  • 东莞污水处理设备厂家推荐:武科环保本土深耕,29 项**工程彰显全场景服务实力 - Guangdong1
  • macOS上OBS Studio屏幕录制中断的完整解决方案指南
  • 终极免费激活IDM下载管理器:30天试用期永久冻结完整指南
  • 嵌入式AI设备表情管理实战指南:5大核心特性深度解析