LeetCode刷题Day05——链表(链表元素删除、相交、环形链表)

news2024/11/23 15:39:39

文章目录

    • 一、删除链表中的倒数第n个节点
    • 二、链表相交
    • 三、环形链表

一、删除链表中的倒数第n个节点

题目链接:19.删除链表中的倒数第n个节点

/**
 * <pre>
 * 最简单的方法显然是先遍历一遍链表,知道长度后重新遍历一次就可以找到指定节点了,由此方法我们不难延伸到另一种解法
 * 既然是删除倒数第n个节点,那么也就是一旦遇到最后一个节点那么它前面的第n个节点就是要删除的节点
 * 我们只要使用快慢指针,慢指针在快指针前n位,那么当快指针到达链表尾时慢指针所指的就是需要删除的节点
 * </pre>
 *
 * @author <a href="https://github.com/kil1ua">Ken-Chy129</a>
 * @date 2023/1/5 14:52
 */
public class 删除链表的倒数第N个结点19 {
    
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode pos1=new ListNode(), pos2=head, res = pos1;
        pos1.next = head;
        int i=0;
        while (pos2 != null) {
            if (i < n) { // 找的是链尾的前第n+1个,这样才能删除链尾的第n个
                i++;
            } else {
                pos1 = pos1.next;
            }
            pos2 = pos2.next;
        }
        pos1.next = pos1.next.next;
        return res.next;
    }

    public ListNode removeNthFromEnd2(ListNode head, int n) {
        ListNode p = new ListNode(), res = p;
        p.next = head;
        Deque<ListNode> stack = new LinkedList<>();
        while (p != null) {
            stack.push(p);
            p = p.next;
        }
        for (int i=0; i<n; i++) {
            stack.pop();
        }
        p = stack.peek();
        p.next = p.next.next;
        return res.next;
    }
}

二、链表相交

题目链接:160.链表相交

/**
 * <pre>
 * 计算出两个链表的长度,让长的链表先移动到和短的链表一样长(因为交点不可能在前面部分),随后两个链表同时移动,相等时即为交点
 * 或者使用哈希表将第一个链表的元素进行存储,然后遍历第二个链表判断当前节点是否存在在哈希表中
 * 两者时间复杂度相同,但是哈希表需要额外的空间开销(哈希表查找元素是需要O(1)的时间复杂度,所以总的时间开销相同)
 * </pre>
 *
 * @author <a href="https://github.com/kil1ua">Ken-Chy129</a>
 * @date 2023/1/6 13:49
 */
public class 链表相交160 {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        ListNode pa = headA, pb = headB;
        int lena=1, lenb=1;
        while (pa != null) {
            pa = pa.next;
            lena++;
        }
        while (pb != null) {
            pb = pb.next;
            lenb++;
        }
        pa = headA;
        pb = headB;
        if (lena > lenb) {
            for (int i=1; i<=lena-lenb; i++) {
                pa = pa.next;
            }
        } else if (lena < lenb) {
            for (int i = 1; i <= lenb - lena; i++) {
                pb = pb.next;
            }
        }
        while (pa != null) {
            if (pa == pb) {
                return pa;
            }
            pa = pa.next;
            pb = pb.next;
        }
        return null;
    }

    public ListNode getIntersectionNode2(ListNode headA, ListNode headB) {
        Set<ListNode> visited = new HashSet<ListNode>();
        ListNode temp = headA;
        while (temp != null) {
            visited.add(temp);
            temp = temp.next;
        }
        temp = headB;
        while (temp != null) {
            if (visited.contains(temp)) {
                return temp;
            }
            temp = temp.next;
        }
        return null;
    }
}

三、环形链表

题目链接:142.环形链表

/**
 * <pre>
 * 可以使用快慢指针的方式,让快指针每次走两格,慢指针每次走一格,快指针先入环而且一定会在环中与慢指针相遇
 * 因为在环中对于慢指针来说,其实快指针是以每次1的速度向他逼近,最终一定会碰上
 * </pre>
 *
 * @author <a href="https://github.com/kil1ua">Ken-Chy129</a>
 * @date 2023/1/6 14:26
 */
public class 环形链表II142 {
    public ListNode detectCycle(ListNode head) {
        ListNode pos1 = head, pos2 = head;
        while (pos2 != null) {
            if (pos2.next == null) {
                return null;
            }
            pos1 = pos1.next;
            pos2 = pos2.next.next;
            if (pos2 == pos1) {
                ListNode p = head;
                while (p != pos1) {
                    p = p.next;
                    pos1 = pos1.next;
                }
                return p;
            }
        }
        return null;
    }
}

注释中已经分析了如果有环为什么两个指针一定会在环中相遇,接下来分析一下如何寻找环的起点。

fig1

途中紫色点为快慢指针的相遇点,假设快指针走了n圈后与慢指针相遇,那么相遇时有:

  • 快指针走的距离:a+n(b+c)+b
  • 快指针走的距离是慢指针的两倍
  • 慢指针走的距离:a+b
    • 为什么慢指针一定会在第一圈跟快指针相遇?
    • 其实在注释中也写到了,每次循环可以理解为快指针在以每次为1的速度追赶慢指针,而在慢指针进入环的时候快指针距离它的距离最多也是少于1圈(快指针在慢指针前一位时为最长距离),那么追赶到的时候慢指针必然没有进入下一圈
  • 那么就有a+n(b+c)+b=2(a+b),化简得a=c+(n-1)(b+c),(n-1)(b+c)表示n-1圈,那么也就是说只要这时让一个指针从链表起点出发,另一个指针从快慢指针相遇点出发,那它们会正好在环的起点相遇(因为a的长度等于从快慢指针相交点绕环n-1圈后再走c的长度,而再走c的长度正好就是到环的起点)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/144553.html

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

相关文章

WebDAV之葫芦儿·派盘+DAVx⁵

DAVx⁵ 支持WebDAV方式连接葫芦儿派盘。 支持移动设备远程同步,是不是比NAS更便捷?并且这款软件最为关键的还是支持各种协议,让你能够在跨平台上面同步安卓和苹果上面的内容,你可以在服务器上面进行一些简单的内容管理,快来试试DAVx⁵与派盘的最佳组合吧。 DAVx⁵是一款…

LeetCode:18. 四数之和

18. 四数之和1&#xff09;题目2&#xff09;思路3&#xff09;代码4&#xff09;结果1&#xff09;题目 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &…

Codeforces Round #772 (Div. 2)

A. Min Or Sum 题目链接&#xff1a;Problem - A - Codeforces 样例输入&#xff1a; 4 3 1 3 2 5 1 2 4 8 16 2 6 6 3 3 5 6样例输出&#xff1a; 3 31 6 7题意&#xff1a;给你一个长度为n的数组&#xff0c;我们可以对这个数组进行操作&#xff0c;每次操作可以选择两个不…

ThinkPHP5之文件包含审计分析(五)

说明 该文章来源于同事lu2ker转载至此处&#xff0c;更多文章可参考&#xff1a;https://github.com/lu2ker/ 文章目录说明0x00 环境准备0x01 测试代码0x02 代码分析0x03 总结参考链接&#xff1a;Mochazz/ThinkPHP-Vuln/ 影响版本&#xff1a;5.0.0<ThinkPHP5<5.0.18 、…

Java - JIT即时编译

java前端编译器和后端编译器的作用Java前端编译器&#xff1a;javac 编译&#xff0c;在程序运行前&#xff0c;将 源文件 转化为 字节码 即 .class 文件Java 程序最初只能通过解释器解释执行&#xff0c;即 JVM 对字节码逐条解释执行&#xff0c;因此执行速度比较慢。字节码与…

【SAP Abap】SAP Flight 航班系统数据模型简介(SCARR、SPFLI、SFLIGHT、SBOOK等)

SAP Flight 航班系统数据模型简介&#xff08;SCARR、SPFLI、SFLIGHT、SBOOK等&#xff09;1、本文目的2、数据模型3、查看模型数据4、生成演示数据5、模型应用1、本文目的 SAP ABAP 系统都会自带 Flight 航班系统数据模型&#xff0c;其大量应用于 SAP ABAP 帮助文档、系统 D…

移动安全总结 2019

声明 本文是学习移动安全总结 2019. 下载地址 http://github5.com/view/1223而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 序言 随着2019年的逝去&#xff0c;二十一世纪第二个十年也已随之结束。回顾过去的十年&#xff0c;我们的生活随着科技的进…

养老院人员定位方案125K芯片AS3933/SI3933/GC3933/PAN3501

随着社会老龄化&#xff0c;高龄化&#xff0c;空巢化和病残化的迅速发展&#xff0c;将使得越来越多的老人住进养老院。虽养老院数量越来越多&#xff0c;但养老院人也越来越多&#xff0c;给现有的养老管理上带来压力&#xff0c;由于服务人员有限&#xff0c;无法及时顾及到…

【LeetCode每日一题】——89.格雷编码

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【时间频度】九【代码实现】十【提交结果】一【题目类别】 数学 二【题目难度】 中等 三【题目编号】 89.格雷编码 四【题目描述】 n 位格雷码序列 是一…

举个栗子!Tableau 技巧(249):为文本表中的不同度量设置不同颜色

使用文本表呈现数据时&#xff0c;通常会用颜色的深浅来代表度量的数值大小。单一度量很容易实现&#xff0c;但多个度量的情况&#xff0c;很多数据粉反馈不知道如何实现。 如下示例&#xff0c;在为不同度量设置了不同颜色后&#xff0c;的确既美观又直观。 具体该如何实现呢…

进制转换 2进制转10进制 10进制转2进制

觉得有用的&#xff0c;HXD们请点个赞●▽● 10进制转2进制&#xff08;以十进制100转换为二进制为例子&#xff1a;&#xff09; 方法一&#xff08;除2取余数&#xff0c;倒叙摆列&#xff0c;高位补零 &#xff09; 100/250余0&#xff1b; 50/225余0&#xff1b; 25/21…

Allegro174版本新功能介绍之改变菜单字体大小

Allegro174版本新功能介绍之改变菜单字体大小 Allegro在升级到174的时候,默认的字体是非常小的,如下图 看起来十分费劲 启动界面 菜单界面 但是174是支持把把这些字体调大的,具体操作如下 选择Setup

git远程仓库使用流程

git远程仓库使用流程远程仓库使用流程远程仓库介绍远程仓库使用流程如何将本地文件夹关联远程仓库多人开发配置流程远程仓库SSH配置远程仓库使用流程总结git分支使用流程分支介绍1.2-分支使用流程远程仓库使用流程 Git命名作用详细描述git clone克隆远程仓库代码把服务器的项目…

Laravel 开发 API 时的前置准备

前言 使用 Laravel 有一段时间了&#xff0c;今天来总结我平时进行开发前的一些准备工作&#xff0c;如果有不合理的地方或者有更好的建议欢迎各位大佬指出纠正&#xff01; 环境 PHP8 MySQL5.7 Nginx1.20 IDE&#xff1a;PhpStorm搭建 安装 推荐使用 composer 安装 或者…

舆情监测技术方案,网络舆情分析技术手段有哪些?

网络舆情分析技术手段着力于利用技术实现对海量的网络舆情信息进行深度挖掘与分析&#xff0c;以快速汇总成舆情信息&#xff0c;从而代替人工阅读和分析网络舆情信息的繁复工作&#xff0c;接下来TOOM舆情监测小编带您简单了解舆情监测技术方案&#xff0c;网络舆情分析技术手…

网站服务器运行过程中有哪些常见问题?

网站服务器运行过程中有哪些常见问题?在线业务运转过程中&#xff0c;网站服务器的宕机或无法访问往往会给访客带来极差的用户体验&#xff0c;继而影响到在线业务的品牌声誉及长远发展。下面聊聊关于网站服务器的常见问题&#xff0c;需多加留意。 1.页面加载速度变慢 这是用…

Leetcode:222. 完全二叉树的节点个数(C++)

目录 问题描述&#xff1a; 实现代码与解析&#xff1a; 直接当普通二叉树遍历&#xff1a; 利用完全二叉树和满二叉树的特性&#xff1a; 原理思路&#xff1a; 问题描述&#xff1a; 给你一棵 完全二叉树 的根节点 root &#xff0c;求出该树的节点个数。 完全二叉树 的…

js实现纯前端压缩图片

演示 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>压缩图片</title> </head> <bo…

php学习笔记-phpday1

php代码基本语法 PHP&#xff08;PHP: Hypertext Preprocessor&#xff09;即“超文本预处理器”&#xff0c;是在服务器端执行的脚本语言&#xff0c;尤其适用于Web开发并可嵌入HTML中。PHP语法学习了C语言&#xff0c;吸纳Java和Perl多个语言的特色发展出自己的特色语法&…

【自学C++】C++ HelloWorld

C HelloWorld C HelloWorld教程 我们打开 Dev-C 软件&#xff0c;界面如下&#xff1a; 我们选择文件 -> 新建 -> 源代码&#xff0c;如下图所示&#xff1a; 点击源代码之后&#xff0c;此时界面如下图所示&#xff1a; 我们在新建的文件中&#xff0c;输入以下内容&a…