【JavaScript】LeetCode:31-35

news2024/12/25 22:33:26

文章目录

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

31 反转链表

在这里插入图片描述

  • 初始化:cur = head,pre = null。
  • pre和cur一起向前移。
  • 由于反转链表时,cur.next指向pre,导致cur在下次循环中就找不到了原来的cur.next,因此需要临时指针temp记录原来的cur.next。
/**
 * 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指向后半部分的头节点[整个链表最后一个节点])。
/**
 * 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中已经存在该节点,则该链表存在环。
/**
 * 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中已经存在该节点,则该节点为入口的第一个节点。
/**
 * 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,即当头节点和相遇点一起向前走,二者指向的节点相等时,该节点为入环的第一个节点。
/**
 * 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较小的节点,先链接到合并链表中。
  • 当其中一个链表遍历完之后,结束循环,将另一个链表全部连接到合并链表中。
/**
 * 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.coloradmin.cn/o/2129967.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

牛客思维题———进制(简单)

C-小红的双好数&#xff08;easy&#xff09;_牛客周赛 Round 57 (nowcoder.com) 思路&#xff1a; 任何一个数n可以表示为n进制&#xff0c;且值为1 特判1 2 即可 代码&#xff1a; #include<bits/stdc.h> #define int long long using namespace std;#define IOS i…

Java设计模式—面向对象设计原则(一) ----->开闭原则OCP(完整详解,附有代码+案例)

3.1开闭原则 对扩展开放&#xff0c;对修改关闭。在程序需要进行拓展的时候&#xff0c;不能去修改原有的代码&#xff0c;实现一个热插拔的效果。简言之&#xff0c;是为了使程序的扩展性好&#xff0c;易于维护和升级。想要达到这样的效果&#xff0c;我们需要使用接口和抽象…

【黑金系】金融UI/UX体验设计师面试作品集 Figma源文件分享

在数字金融时代&#xff0c;UI/UX体验设计师扮演着至关重要的角色。他们不仅塑造着产品的界面&#xff0c;更引领着用户的使用体验。我们的面试作品集&#xff0c;正是这样一部展现金融UI/UX设计魅力的宝典。 这套作品集汇聚了众多经典案例&#xff0c;每一处设计都经过精心雕…

docker部署bind9

一、部署 ## docker 部署bind9# docker run -d --name bind9 --restartalways --publish 53:53/tcp --publish 53:53/udp --publish 10000:10000/tcp --volume /data/docker/dns-server:/data --env ROOT_PASSWORDroot dhub.kubesre.xyz/sameersbn/bind:9.16.1-20200524# 建数…

高等数学精解【13】

文章目录 简化二次方程轴平移轴平移是一种简化二次方程图形表示的有用技巧一元二次方程的轴平移二元二次方程的轴平移轴平移简化二次方程定义性质计算例子一元二次方程的例子二元二次方程的例子&#xff08;圆&#xff09; 例题 轴旋转简化二次方程轴旋转的定义轴旋转的性质例题…

持续集成与持续交付CI/CD

CI/CD 是指持续集成&#xff08;Continuous Integration&#xff09;和持续部署&#xff08;Continuous Deployment&#xff09;或持续交付&#xff08;Continuous Delivery&#xff09; 持续集成&#xff08;Continuous Integration&#xff09; 持续集成是一种软件开发实践&…

plt.imshow(img_show)有什么作用

加plt.imshow(img_show) 不加plt.imshow(img_show)

pytest 接口测试

pytest 是什么 .py文件名 用 test_开头&#xff0c;函数用 test_开头&#xff0c;运行的时候,pycharm会自动用pytest模式去执行代码! 处理excel 文件 点击获取excel 文件 核心思想&#xff1a; 把excel 文件的内容转化为 python的字典数组 可以先阅读 python函数 函数 注意&…

C sharp 学习 笔记

介绍 这篇文章是我学习C#语言的笔记 学的是哔哩哔哩刘铁锰老师2014年的课程 在学习C#之前已经学习过C语言了。看的是哔哩哔哩比特鹏哥的课程。他们讲的都很不错 正在更新&#xff0c; 大家可以在我的gitee仓库中下载笔记源文件、项目资料等 笔记源文件可以在Notion中导入…

pikachu下

CSRF(跨站请求伪造) CSRF(get) url变成了这样了&#xff0c;我们就可以新开个页面直接拿url去修改密码 http://pikachu-master/vul/csrf/csrfget/csrf_get_login.php?username1&password2&submitLogin CSRF(post&#xff09; 这里只是请求的方式不同&#xff0c;…

【解决】AnimationCurve 运行时丢失数据问题

开发平台&#xff1a;Unity 2022 编程平台&#xff1a;Visual Studio 编程语言&#xff1a;CSharp   一、问题背景 如上图所示的 GracityComponent 组件中&#xff0c;引用 AnimationCurve 作为可调属性。但在实际使用中出现数据丢失问题。大致为以下两种情况&#xff1a; 运…

图计算:基于SparkGrpahX计算聚类系数

图计算&#xff1a;基于SparkGrpahX计算聚类系数 文章目录 图计算&#xff1a;基于SparkGrpahX计算聚类系数一、什么是聚类系数二、基于SparkGraphX的聚类系数代码实现总结 一、什么是聚类系数 聚类系数&#xff08;Clustering Coefficient&#xff09;是图计算和网络分析中的…

【Python爬虫系列】_016.关于登录和验证码

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…

【UI】element ui table(表格)expand实现点击一行展开功能

文章目录 前言涉及知识点&#xff1a;代码部分隐藏小箭头总结 前言 element ui是一个非常不错的vue的UI框架&#xff0c;element对table进行了封装&#xff0c;简化了vue对表格的渲染。 element ui表格中有一个功能是展开行&#xff0c;在2.0版本官网例子中&#xff0c;只可以…

Linux和C语言(Day 12)

一、学习内容 存储类型 定义变量语法格式 数据类型 变量名; 存储类型 数据类型 变量名; 【定义变量可以省略存储类型&#xff0c;默认是auto】 定义函数语法格式 数据类型 函数名(参数){} 存储类型 数据类型 函数名(参数){} 【定义函数可以省略存储类型&#xff0c;默认是exte…

【PostgreSQL】安装及使用(Navicat/Arcgis),连接(C#)

简介 PostgreSQL 是一个功能强大的开源对象关系数据库系统 下载地址 PostgreSQL: Downloads 由于我电脑上安装的是arcgispro3.1所以需要下载对应的postgresql版本 PostgreSQL 12 对应的 PostGIS 版本主要是 3.5.0 或更高版本。 安装 一般设置为postgresql 安装扩展插件 此…

计算机的错误计算(九十一)

摘要 讨论自然对数 ln(x)的计算精度问题。 例1. 计算 ln(0.999999999999996) . 不妨用Python计算&#xff0c;则有&#xff1a; 若用Java代码计算&#xff1a; import java.lang.Math; public class Ln{public static void main(String[] args) {double x 0.9999999999999…

JMeter脚本开发

环境部署 Ubuntu系统 切换到root用户 sudo su 安装上传下载的命令 apt install lrzsz 切换文件目录 cd / 创建文件目录 mkdir java 切换到Java文件夹下 cd java 输入rz回车 选择jdk Linux文件上传 解压安装包 tar -zxvf jdktab键 新建数据库 运行sql文件 选择sql文件即…

操作系统 ---- 调度算法的评价指标

一、调度算法评价指标 1.1 CPU利用率 资源利用率。为提高系统的资源利用率&#xff0c;应使系统中的处理机和其它所有资源都尽可能地保持忙碌状态&#xff0c;其中最重要的处理机利用率可用以下方法计算&#xff1a; 例题&#xff1a; 1.2 系统吞吐量 由于吞吐量是指在单位…

Playwright与Selenium的对比:谁是更适合你的自动化测试工具?

在自动化测试领域&#xff0c;Selenium 一直是行业的标杆工具。它功能强大、支持多浏览器、广泛应用于各类项目中。然而&#xff0c;随着技术的发展&#xff0c;新的工具不断涌现&#xff0c;Playwright 作为其中的佼佼者&#xff0c;以其现代化的设计和强大的特性吸引了越来越…