代码随想录算法训练营第4天|LeetCode24,19,02,07,142

24.交换链表结点

题目链接:24. 两两交换链表中的节点 - 力扣(LeetCode)

文章链接:代码随想录 (programmercarl.com)

视频链接:代码随想录算法公开课 | 最强算法公开课 | 代码随想录

第一想法

正常模拟,先画图再说,有点像链表反转?这个模拟完全是错误的,交换第二对时会把第一对的末指针丢掉。

代码随想录想法

有三个比较重要关注的点:

cur的定义一定是要预备交换的一对结点的前一个结点,也就是已经交换完结的一对结点之中的第二个结点。这是理解我们为什么要引入虚拟节点,和循环条件的关键。

交换过程中,每一句代码执行时,哪里指针断了,哪里指针脸上得画图看清楚。不要弄丢前后指针。

while (cur.next!=null&&cur.next.next!=null)这个循环条件要注意前后关系,否则会空指针异常

代码

class Solution2{
    public ListNode swapPairs(ListNode head) {
        ListNode dummyNode = new ListNode(-1, head);
        ListNode cur = dummyNode;
        while (cur.next!=null&&cur.next.next!=null){
            ListNode temp1 = cur.next;
            ListNode temp2 = cur.next.next.next;

            cur.next = cur.next.next;
            cur.next.next = temp1;
            temp1.next = temp2;

            cur = cur.next.next;
        }
        return dummyNode.next;
    }
}

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

题目链接:19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode)

文档链接:代码随想录 (programmercarl.com)

视频链接:链表遍历学清楚! | LeetCode:19.删除链表倒数第N个节点_哔哩哔哩_bilibili

第一想法

暴力解题法,第一遍遍历链表
第二遍指针初始时,链表到达尾部,往回遍历,当i = n+1时,指针恰好等于要删除结点的前一个结点,删除结点。
为方便删除应当设置链表的虚拟头结点。

暴力写不出来,方法二:

首先设置虚拟头结点,然后设置距离为n+1的双指针。

代码随想录想法

双指针想法一致,算是靠自己写的吧。

问题

相隔n个单位,所以快指针要跳n+1个单位,循环是(for int i =0;i<=n;i++),左闭右闭循环n+1次,左闭右开,循环n次。

代码

class Solution1 {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode dummyNode = new ListNode(-1,head);
        ListNode begin = dummyNode;
        ListNode end =dummyNode;
        for (int i = 0; i <= n; i++) {
            end = end.next;
        }
        while(end!=null){
            begin =begin.next;
            end = end.next;
        }
        begin.next = begin.next.next;
        return dummyNode.next;
    }
}

面试题02.07题链表相交

题目链接:面试题 02.07. 链表相交 - 力扣(LeetCode)

文档链接:代码随想录 (programmercarl.com)

第一想法

和19题很类似,同样是长度差。

先统计链表A和链表B的长度,设置相距链表长度差的双指针,二者同时往后走。一旦数值相等,那么就一定是相同的第一个结点。

代码

class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        ListNode longList = headA;
        ListNode shortList = headB;
        int longLength = 0;
        int shortLength = 0;
        while (longList!=null){
            longLength++;
            longList = longList.next;
        }
        while (shortList!=null){
            shortLength++;
            shortList = shortList.next;
        }
        longList = headA;
        shortList = headB;
        if(longLength<shortLength){
            ListNode tempNode = longList;
            longList = shortList;
            shortList = tempNode;
            int temp = longLength;
            longLength = shortLength;
            shortLength = temp;
        }
        int gap = longLength-shortLength;
        while(gap-->0)
            longList = longList.next;
        while (longList!=null){
            if(longList ==shortList )
                return longList;
            longList = longList.next;
            shortList = shortList.next;
        }
        return null;
    }
}

142.环形链表2

第一想法:

第一想法就是我做不出来

代码随想录思路:

慢指针一次走一个结点,快指针一次走两个结点,快指针相对慢指针一个结点一个结点的追赶,所以总会有一次相遇。

假设快指针和慢指针相遇,其中慢指针一定会在尚未走完的第一圈,而快指针可能已经转了好几圈。

当相遇时,慢指针走的距离:x+y

快指针走的距离:x+n(y+z)+y

有等式:2(x+y) = x+n(y+z)+y

即:x = (n-1)(y+z)+z;

n至少是>=1的

当n = 1 时,只需要设置起始点指针和相遇点指针同时往前走,相等时即是程序入口,因为x = z

当n>1时,只不过相遇处的指针在圆里多转几圈,将圆展开来还是一样的。

   while (fast !=null && fast.next != null){
            fast = fast.next.next;
            slow =slow.next;
        }

 这个判断条件要会想起24题的判断条件,走两步的指针如何在判断终点的同时避免空指针异常。

代码:

class Solution {
    public ListNode detectCycle(ListNode head) {
        ListNode fast = head;
        ListNode slow = head;
        while (fast !=null && fast.next != null){
            fast = fast.next.next;
            slow =slow.next;
            if(slow==fast){//如果有环
                ListNode index1 = head;
                ListNode index2 = slow;
                while (index1!=index2){
                    index1 = index1.next;
                    index2 = index2.next;
                }
                return index1;
            }
        }
        return null;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

47.HOOK引擎优化支持CALL与JMP位置做HOOK

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 上一个内容&#xff1a;46.修复HOOK对代码造成的破坏 以 46.修复HOOK对代码造成的破坏 它的代码为基础进行修改 优化的是让引擎支持从短跳JMP&#xff08;E9&…

JUC(java.util.concurrent)中的常见类

文章目录 Callable接口ReentrantLockReentrantLock 和 synchronized 的区别:如何选择使用哪个锁? 信号量SemaphoreCountDownLatch多线程环境使用ArrayList多线程使用 哈希表相关面试题 JUC放了和多线程有关的组件 Callable接口 和Runnable一样是描述一个任务,但是有返回值,表…

leetcode-每日一题

3101. 交替子数组计数https://leetcode.cn/problems/count-alternating-subarrays/ 给你一个 二进制数组 nums 。 如果一个 子数组 中 不存在 两个 相邻 元素的值 相同 的情况&#xff0c;我们称这样的子数组为 交替子数组 。 返回数组 nums 中交替子数组的数量。 示例 …

Linux字符设备驱动

一、字符设备驱动结构 1. cdev结构体 在Linux内核中&#xff0c;使用cdev结构体来描述一个字符设备 struct cdev {struct kobject kobj; //内嵌kobject对象struct module *owner; //所属的模块const struct file_operations *ops; //该设备的文件操作结构体struct list_head…

确认下单:购物车页面点击 去结算 按钮发起两个请求trade(显示购物车的商品信息和计算商品的总金额)findUserAddressList

文章目录 1、确认下单&#xff1a;购物车页面点击去结算1.1、在OrderController类中创建 trade 方法1.2、在CartController类中创建 checkedCartInfos1.3、CartServiceImpl 实现 checkedCartInfos的业务功能1.4、在service-cart-client模块下定义远程openFeign接口1.5、在SpzxO…

Java - 程序员面试笔记记录 实现 - Part3

4.1 线程与进程 线程是程序执行的最小单元&#xff0c;一个进程可以拥有多个线程&#xff0c;各个线程之间共享程序的内存空间以及一些进程级资源&#xff0c;但拥有自己的栈空间。 4.3 Java 多线程 方法一&#xff1a;继承 Thread 类&#xff0c;重写 run 方法&#xff1b;…

qt QGridLayout 简单实验1

1.概要 2.实验 2.1 实验1 简单实验跨行 2.1.1 代码 #ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);~W…

Golang语法规范和风格指南(一)——简单指南

1. 前引 一个语言的规范的学习是重要的&#xff0c;直接关系到你的代码是否易于维护和理解&#xff0c;同时学习好对应的语言规范可以在前期学习阶段有效规避该语言语法和未知编程风格的冲突。 这里是 Google 提供的规范&#xff0c;有助于大家在开始学习阶段对 Golang 进行一…

如何魔改vnstat-docker项目使其支持每1分钟采样?

文章目录 一、概述二、官网参考1. 官网地址2. 查看打包过程3.打包命令 三、修改过的文件四、部署运行1. 编排文件2. 运行效果 一、概述 接前文 网络流量监控神器vnStat初探 我们已经了解了vnStat的作用、使用和docker部署。 同时也了解到官方版本支持的采样统计间隔最小为5分…

【Unity】unity学习扫盲知识点

1、建议检查下SystemInfo的引用。这个是什么 Unity的SystemInfo类提供了一种获取关于当前硬件和操作系统的信息的方法。这包括设备类型&#xff0c;操作系统&#xff0c;处理器&#xff0c;内存&#xff0c;显卡&#xff0c;支持的Unity特性等。使用SystemInfo类非常简单。它的…

Linux操作系统的引导过程

系统初始化进程与文件、systemd概述、单元类型、切换运行级别、查看系统默认默认运行、永久切换、常见的系统服务&#xff08;centos&#xff09;-CSDN博客 centos 7系统升级内核&#xff08;ELRepo仓库&#xff09;、小版本升级、自编译内核-CSDN博客 ss命令详细使用讲解文…

tongweb+ths6011测试websocket(by lqw)

本次使用的tongweb版本7049m4&#xff0c;测试包ws_example.war&#xff08;在tongweb安装目录的samples/websocket下&#xff09;&#xff0c;ths版本6011 首先在tongweb控制台部署一下ws_example.war,部署后测试是否能访问&#xff1a; 然後ths上的httpserver.conf的參考配…

游戏服务器搭建选VPS还是专用服务器?

游戏服务器搭建选VPS&#xff0c;VPS能够提供控制、性能和稳定性。它不仅仅是让游戏保持活力。它有助于减少延迟问题&#xff0c;增强您的游戏体验。 想象一下&#xff1a;你正沉浸在一场游戏中。 胜利在望。突然&#xff0c;屏幕卡住——服务器延迟。 很崩溃&#xff0c;对…

PageCache页缓存

一.PageCache基本结构 1.PageCache任务 PageCache负责使用系统调用向系统申请页的内存,给CentralCache分配大块儿的内存,以及合并前后页空闲的内存,整体也是一个单例,需要加锁. PageCache桶的下标按照页号进行映射,每个桶里span的页数即为下标大小. 2.基本结构 当每个线程的…

文件、文本阅读与重定向、路径与理解指令——linux指令学习(一)

前言&#xff1a;本节内容标题虽然为指令&#xff0c;但是并不只是讲指令&#xff0c; 更多的是和指令相关的一些原理性的东西。 如果友友只想要查一查某个指令的用法&#xff0c; 很抱歉&#xff0c; 本节不是那种带有字典性质的文章。但是如果友友是想要来学习的&#xff0c;…

Python 空间和时间高效的二项式系数(Space and time efficient Binomial Coefficient)

这里函数采用两个参数n和k&#xff0c;并返回二项式系数 C(n, k) 的值。 例子&#xff1a; 输入&#xff1a; n 4 和 k 2 输出&#xff1a; 6 解释&#xff1a; 4 C 2 等于 4!/(2!*2!) 6 输入&#xff1a; n 5 和 k 2 输出&#xff1a; 10 解释&#xff1a; 5 C …

moonlight+sunshine+ParsecVDisplay ipad8-windows 局域网串流

1.sunshine PC 安装 2.设置任意账户密码登录 3.setting 里 network启用UPNP IPV4IPV6 save apply 4.ParsecVDisplay虚拟显示器安装 5.ipad appstore download moonlight 6.以ipad 8 为例 2160*1620屏幕分辨率 7.ParsecVDisplay里面 custom设置2160*1620 240hz&#xff0c;…

python conda查看源,修改源

查看源 conda config --show-sources 修改源 可以直接vim .condarc修改源&#xff0c;

CSS中 实现四角边框效果

效果图 关键代码 border-radius:10rpx ;background: linear-gradient(#fff, #fff) left top,linear-gradient(#fff, #fff) left top,linear-gradient(#fff, #fff) right top,linear-gradient(#fff, #fff) right top,linear-gradient(#fff, #fff) left bottom,linear-gradient(…

CentOS7安装Mysql8.4.0

简介 本文介绍了Linux CentOS系统下Mysql8.4.0的下载和安装方法 环境 (rpm -q centos-release) centos-release-7-2.1511.el7.centos.2.10.x86_64 正文 一、去官网下载Mysql8.4.0 下载参考我另一篇mysql5.7.4的安装 CentOS7.9安装Mysql5.7-m14_centos下mysql5.7下载-CSDN博客…