【JavaScript】LeetCode:31-35

embedded/2024/9/23 23:35:35/

文章目录

  • 31 反转链表
  • 32 回文链表
  • 33 环形链表
  • 34 环形链表Ⅱ
  • 35 合并两个有序链表

31 反转链表

在这里插入图片描述

  • 初始化:cur = head,pre = null。
  • pre和cur一起向前移。
  • 由于反转链表时,cur.next指向pre,导致cur在下次循环中就找不到了原来的cur.next,因此需要临时指针temp记录原来的cur.next。
javascript">/*** 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 reverseList = function(head) {if(!head || !head.next){return head;} var pre = null;var cur = head;while(cur){var temp = cur.next;cur.next = pre;pre = cur;cur = temp;}return pre;
};

32 回文链表

在这里插入图片描述

  • 方法1:将链表节点的val放入数组中,然后利用双指针判断是否为回文数组(i指向第一个元素,j指向最后一个元素)。
  • 方法2:快慢指针,这里给出该方法的代码。
  • 将后半部分反转,前半部分和后半部分链表比较。
  • 快指针1次走2步,慢指针1次走1步。
  • 快指针走到头,慢指针刚好到中间,此时这个中间点既是反转链表的起点。
  • 后半部分链表反转后,利用双指针判断是否为回文链表(left指向前部分的头节点[整个链表的头节点],right指向后半部分的头节点[整个链表最后一个节点])。
javascript">/*** Definition for singly-linked list.* function ListNode(val, next) {*     this.val = (val===undefined ? 0 : val)*     this.next = (next===undefined ? null : next)* }*/var reverseList = function(head) {if(!head || !head.next){return head;} var pre = null;var cur = head;while(cur){var temp = cur.next;cur.next = pre;pre = cur;cur = temp;}return pre;
};var findMiddle = function(head) {var fast = head;var slow = head;while(fast.next != null && fast.next.next != null){fast = fast.next.next;slow = slow.next;}return slow;
}/*** @param {ListNode} head* @return {boolean}*/
var isPalindrome = function(head) {var mid = findMiddle(head);var right = reverseList(mid);var left = head;while(left != null && right != null){if(left.val != right.val){return false;}left = left.next;right = right.next;}return true;
};

33 环形链表

在这里插入图片描述

  • 哈希集合
  • 遍历链表节点,将节点放入Set中,若Set中已经存在该节点,则该链表存在环。
javascript">/*** Definition for singly-linked list.* function ListNode(val) {*     this.val = val;*     this.next = null;* }*//*** @param {ListNode} head* @return {boolean}*/
var hasCycle = function(head) {var set = new Set();while(head != null){if(set.has(head)){return true;}set.add(head);head = head.next;}return false;
};

34 环形链表Ⅱ

在这里插入图片描述

  • 方法1:哈希集合,遍历链表节点,将节点放入Set中,若Set中已经存在该节点,则该节点为入口的第一个节点。
javascript">/*** Definition for singly-linked list.* function ListNode(val) {*     this.val = val;*     this.next = null;* }*//*** @param {ListNode} head* @return {ListNode}*/
var detectCycle = function(head) {var set = new Set();while(head != null){if(!set.has(head)){set.add(head);}else{return head;}head = head.next;}return null;
};
  • 方法2:快慢指针。
  • 快指针1次走2步,慢指针1次走1步。快指针绕圈了,快指针追慢指针。
  • 假设:从链表头节点到入环的第一个节点的长度为x,入环的第一个节点到快、慢指针相遇点的长度为y,快、慢指针相遇点到入环的第一个节点的长度为z。
  • 当快、慢指针相遇时,证明链表有环。
  • slow = x + y,fast = x + y + n(y + z)
  • 2(x + y) = x + y + n(y + z)
  • x + y = n(y + z)
  • x = n(y + z) - y = (n - 1)(y + z) + z
  • n = 1时,x = z,即当头节点和相遇点一起向前走,二者指向的节点相等时,该节点为入环的第一个节点。
javascript">/*** Definition for singly-linked list.* function ListNode(val) {*     this.val = val;*     this.next = null;* }*//*** @param {ListNode} head* @return {ListNode}*/
var detectCycle = function(head) {var fast = head;var slow = head;while(fast != null && fast.next != null){fast = fast.next.next;slow = slow.next;if(fast == slow){var i = head;var j = fast;while(i!= j){i = i.next;j = j.next;}return i;}}return null;
};

35 合并两个有序链表

在这里插入图片描述

  • 哨兵节点:该节点无意义,从第2个节点开始才保存真正有意义的信息。具有哨兵节点的链表不需要单独处理输入头节点为null的情况。
  • 比较两个链表的大小,val较小的节点,先链接到合并链表中。
  • 当其中一个链表遍历完之后,结束循环,将另一个链表全部连接到合并链表中。
javascript">/*** Definition for singly-linked list.* function ListNode(val, next) {*     this.val = (val===undefined ? 0 : val)*     this.next = (next===undefined ? null : next)* }*/
/*** @param {ListNode} list1* @param {ListNode} list2* @return {ListNode}*/
var mergeTwoLists = function(list1, list2) {var newNode = new ListNode(); var cur = newNode; while(list1 != null && list2 != null){if(list1.val < list2.val){cur.next = list1;list1 = list1.next;}else{cur.next = list2;list2 = list2.next;}cur = cur.next;}if(list1 != null){cur.next = list1;}if(list2 != null){cur.next = list2;}return newNode.next;
};

http://www.ppmy.cn/embedded/110945.html

相关文章

【Qt】按钮样式--按钮内部布局(调整按钮文本和图标放置在任意位置)

要求&#xff1a; 有一个按钮&#xff0c;要求按钮的右下角显示开关&#xff0c;点击切换开关状态 ps&#xff1a;注意&#xff0c;要求你添加完了之后&#xff0c;整个按钮的点击区域不变&#xff08;就是说&#xff0c;点击右下角的文本&#xff0c;也可以触发按钮的点击事件…

期权组合策略有什么风险?期权组合策略是什么?

今天期权懂带你了解期权组合策略有什么风险&#xff1f;期权组合策略是什么&#xff1f;期权组合策略是通过结合不同期权合约&#xff08;如看涨期权和看跌期权&#xff09;&#xff0c;以及标的资产&#xff08;如股票&#xff09;来实现特定投资目标的策略。 期权组合策略市…

【数字集成电路与系统设计】基本的组合逻辑电路

目录 一、简单例子引入 1.1 端口声明 1.1.2 Verilog实现 1.1.3 Chisel实现 逐行解释 1.2 内部逻辑实现 1.2.1 Verilog实现 1.2.2 Chisel实现 Chisel 关键点解释 1.3 常用的硬件原语 二、Chisel主要数据类型介绍 2.1 数据类型 2.2 数据宽度 2.3 数据转换 2.4 运算…

Docker和K8S

Docker技术可以将生成的镜像&#xff0c;在docker容器中运行。Build Once Run Anywhere K8s是对容器集群进行管理协调的工具 一个K8S集群 有一个master节点和多个node节点 master节点里面有 1、etcd&#xff1a;文件保存集群各个节点的状态数据&#xff0c;配置数据等。使用raf…

弱口令爆破

本文仅作为学习参考使用&#xff0c;本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 本文基于burp抓包软件针对dvwa靶场进行弱口令爆破测试。 靶场设置&#xff1a; 在DVWA Security中&#xff0c;设置安全等级&#xff0c;并保存。 打开靶场。 1&#xff0c;抓包。…

分布式本地缓存 ehcache 缓存同步复制

使用spring cache的方式 spring:#ehcache 配置cache:# 指定缓存类型 ehcache 本地缓存 redis 缓存type: ehcacheehcache:config: classpath:ehcache.xmlredis:# 指定存活时间&#xff08;ms&#xff09;time-to-live: 86400000# 指定前缀use-key-prefix: true# 是否缓存空值&a…

代码随想录 | Day21 | 二叉树:找树左下角的值路径总和

代码随想录 | Day21 | 二叉树&#xff1a;找树左下角的值&&路径总和 主要学习内容&#xff1a; 1.利用二叉树的谦虚遍历进行题目解答 2.to_string函数的使用 513.找树左下角的值 513. 找树左下角的值 - 力扣&#xff08;LeetCode&#xff09; 解法一&#xff1a;…

ThreeJS入门(001):简介、下载安装、历史、应用场景、竞品

查看本专栏目录 - 本文是第 001篇入门文章 文章目录 一、 Three.js 简介二、 Three.js 的历史与发展三、 公司背景四、下载安装五、官方网站六、应用范围场景七、相关竞品 一、 Three.js 简介 Three.js 是一个基于 WebGL 的 JavaScript 3D 库&#xff0c;它使得在 Web 上创建和…