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

【JavaScript】LeetCode:36-40

文章目录

  • 36 两数相加
  • 37 删除链表的倒数第n个节点
  • 38 两两交换链表中的节点
  • 39 k个一组翻转链表
  • 40 随机链表的复制

36 两数相加

在这里插入图片描述

  • 创建一个新的链表(哨兵节点指向),这个链表用来表示两个数相加后的和。
  • 从个位开始相加,每次都向新链表尾部添加一个节点,即保存一个数位。
  • 遍历l1和l2,每次都计算sum = l1.val + l2.val + carry(进位),将sum % 10作为当前节点要保存的数位,将sum / 10作为新的进位值。
/*** Definition for singly-linked list.* function ListNode(val, next) {*     this.val = (val===undefined ? 0 : val)*     this.next = (next===undefined ? null : next)* }*/
/*** @param {ListNode} l1* @param {ListNode} l2* @return {ListNode}*/
var addTwoNumbers = function(l1, l2) {var carry = 0;var dummy = new ListNode();cur = dummy;while(l1 || l2 || carry){sum = (l1? l1.val: 0) + (l2? l2.val: 0) + carry;var node = new ListNode(sum % 10);cur.next = node;carry = Math.floor(sum / 10);cur = cur.next;if(l1){l1 = l1.next;}if(l2){l2 = l2.next;}}return dummy.next;
};

37 删除链表的倒数第n个节点

在这里插入图片描述

  • 快慢指针
  • 添加哨兵节点,要删除倒数第n个节点,需要先找到倒数第n + 1个节点(即第n个节点的前一个结点)。
  • 快指针先移动n + 1步,然后快、慢指针一起向前移动,当快指针指向null时,慢指针就指向倒数第n + 1个节点。
  • 快指针比慢指针快n + 1步,所以当快指针指向null时,慢指针距离null还有n + 1个节点,即慢指针指向倒数第n + 1个节点。
  • 将倒数第n + 1个节点指向倒数第n - 1个节点。
/*** Definition for singly-linked list.* function ListNode(val, next) {*     this.val = (val===undefined ? 0 : val)*     this.next = (next===undefined ? null : next)* }*/
/*** @param {ListNode} head* @param {number} n* @return {ListNode}*/
var removeNthFromEnd = function(head, n) {var dummy = new ListNode();dummy.next = head;var fast = dummy, slow = dummy;while(n + 1 && fast != null){fast = fast.next;n--;}while(fast != null){fast = fast.next;slow = slow.next;}slow.next = slow.next.next;return dummy.next;
};

38 两两交换链表中的节点

在这里插入图片描述

  • 添加哨兵节点。
  • 操作指针cur指向要反转的两个节点的前一个结点,例如要反转节点3、4,cur应该指向节点2。
  • 当结点个数为偶数时,cur.next = null结束操作。
  • 当结点个数为奇数时,cur.next.next = null结束操作。
  • 例:哨兵节点(cur) => 节点1 => 节点2 => 节点3 => 节点4 => … => null,这里要反转节点1、2。
  • 临时变量:temp1存储节点2,temp2存储节点3。
  • ① cur指向节点2。
  • ② 节点2指向节点1(temp1)。
  • ③ 节点1指向节点3(temp2)。
  • 改变顺序后的链表为:哨兵节点(cur) => 节点2 => 节点1 => 节点3 => 节点4 => … => null。
  • 操作节点cur指向节点1,继续进行节点3、4的交换。
/*** Definition for singly-linked list.* function ListNode(val, next) {*     this.val = (val===undefined ? 0 : val)*     this.next = (next===undefined ? null : next)* }*/
/*** @param {ListNode} head* @return {ListNode}*/
var swapPairs = function(head) {var dummy = new ListNode();dummy.next = head;var cur = dummy;while(cur.next != null && cur.next.next != null){var temp1 = cur.next;var temp2 = cur.next.next.next;cur.next = cur.next.next; // dummy => 2cur.next.next = temp1; // 2 => 1cur.next.next.next = temp2; // 1 => 3cur = cur.next.next; // cur => 1}return dummy.next;
};

39 k个一组翻转链表

在这里插入图片描述

  • 先求链表长度,每次判断剩余节点个数 >= k才能进行反转。
  • 将连续k个节点反转:反转结束后,从原来的链表上看,pre指向这k个节点的最后一个节点,cur指向这k个节点的下一个节点。反转链表的解析及代码详见:31 反转链表。
  • 添加哨兵节点,p指向哨兵节点,p作为这k个反转节点的前一个结点,该节点在反转后.next指向pre(反转后的第一个节点)。
  • 临时变量pn作为p结点的下一个结点,同时pn也是这k个节点在反转前的第一个节点、反转后的最后一个结点,pn(下一段的前一个节点)在反转结束后.next指向cur(下一段的第一个节点)。
  • 更新p,指向pn。
/*** Definition for singly-linked list.* function ListNode(val, next) {*     this.val = (val===undefined ? 0 : val)*     this.next = (next===undefined ? null : next)* }*/
/*** @param {ListNode} head* @param {number} k* @return {ListNode}*/
var reverseKGroup = function(head, k) {var count = 0;var cur = head;while(cur){count++;cur = cur.next;}var dummy = new ListNode();dummy.next = head;var p = dummy;var pre = null;cur = p.next;while(count >= k){count -= k;for(var i = 1; i <= k; i++){var temp = cur.next;cur.next = pre;pre = cur;cur = temp;}var pn = p.next;p.next = pre;pn.next = cur;p = pn;}return dummy.next;
};

40 随机链表的复制

在这里插入图片描述

  • 哈希表
  • 构造原链表节点和新链表节点的映射关系,然后根据原链表节点的next和random指向,更新新链表。
  • 第1次遍历链表:新建节点,在哈希表中添加键值对(原节点,新节点)。
  • 第2次遍历链表:添加新节点的next和random指向。
  • 注意:若节点的.next或.random为null,map.get(null)返回undefined,undefined的布尔值为false。
/*** // Definition for a _Node.* function _Node(val, next, random) {*    this.val = val;*    this.next = next;*    this.random = random;* };*//*** @param {_Node} head* @return {_Node}*/
var copyRandomList = function(head) {if(head == null){return head;}var map = new Map();var cur = head;while(cur){map.set(cur, new _Node(cur.val));cur = cur.next;}cur = head;while(cur){map.get(cur).next = map.get(cur.next) || null;map.get(cur).random = map.get(cur.random) || null;cur = cur.next;}return map.get(head);
};

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 系统架构设计师 需求分析篇一
  • vue中动态引入加载图片不显示
  • AI大模型与产品经理:替代与合作的深度剖析
  • 说⼀说hashCode()和equals()的关系
  • Corrupt block relative dba: 0x02c0b382 (file 11, block 45954)
  • 动态内存
  • 【Obsidian】当笔记接入AI,Copilot插件推荐
  • 函数模板(初阶)
  • C:字符串函数(续)-学习笔记
  • C语言中实现在动态库中访问另一个动态库变量
  • 白月光git
  • 为什么H.266未能普及?EasyCVR视频编码技术如何填补市场空白
  • 如何建立一个Webservice WSDL的简单例子(完整例子)
  • java数据结构----图
  • 清华大佬自曝:接到了省烟草局的offer,我就拒掉了华为!结果华为立马给我申请了特殊涨薪,总包70w是烟草的2倍,这可如何是好?
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • Android优雅地处理按钮重复点击
  • C++入门教程(10):for 语句
  • docker python 配置
  • Docker入门(二) - Dockerfile
  • ES10 特性的完整指南
  • es6
  • IndexedDB
  • Java|序列化异常StreamCorruptedException的解决方法
  • Java的Interrupt与线程中断
  • JSDuck 与 AngularJS 融合技巧
  • Just for fun——迅速写完快速排序
  • MySQL-事务管理(基础)
  • Spark RDD学习: aggregate函数
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • ubuntu 下nginx安装 并支持https协议
  • 关于Java中分层中遇到的一些问题
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 前端js -- this指向总结。
  • 微信开源mars源码分析1—上层samples分析
  • 关于Android全面屏虚拟导航栏的适配总结
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • ‌‌雅诗兰黛、‌‌兰蔻等美妆大品牌的营销策略是什么?
  • # .NET Framework中使用命名管道进行进程间通信
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • $$$$GB2312-80区位编码表$$$$
  • (2)从源码角度聊聊Jetpack Navigator的工作流程
  • (阿里云万网)-域名注册购买实名流程
  • (八)Spring源码解析:Spring MVC
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (一)SpringBoot3---尚硅谷总结
  • (状压dp)uva 10817 Headmaster's Headache
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .DFS.
  • .net 托管代码与非托管代码
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .NET与 java通用的3DES加密解密方法
  • @FeignClient注解,fallback和fallbackFactory
  • @SuppressWarnings(unchecked)代码的作用