_4LeetCode代码随想录算法训练营第四天-C++

news2024/12/24 8:15:17

_4LeetCode代码随想录算法训练营第四天-C++

    1. 两两交换链表中的节点
  • 19.删除链表的倒数第N个节点

  • 面试题 02.07. 链表相交

  • 142.环形链表II

24.两两交换链表中的节点

整体思路

不是简单地交换值,而是交换指针地指向。

在这里插入图片描述

终止条件为:

cur->next != nullptr && cur->next->next != nullptr
两者不能交换位置,因为交换位置可能会导致访问了空指针

代码

/*
 * @lc app=leetcode.cn id=24 lang=cpp
 *
 * [24] 两两交换链表中的节点
 */

// @lc code=start
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        ListNode* preHead = new ListNode(0,head);//定义一个虚拟头节点,方便操作
        ListNode* cur = preHead;//交换两节点之前,cur指向两节点之前的一个位置
        ListNode* temp;//临时节点
        ListNode* temp1;//临时节点1
        //具体的交换方式为代码随想录上面画的图
        while(cur->next != nullptr && cur->next->next != nullptr)
        {
            temp = cur->next;
            temp1 = cur->next->next->next;
            cur->next = cur->next->next;
            cur->next->next = temp;
            temp->next = temp1;
            cur = cur->next->next;//Emmm,这里写的时候忘记了,就死循环了哈哈哈
        }
        return preHead->next;
    }
};
// @lc code=end

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

整体思路

1.定义快指针和慢指针,初始值都为虚拟头节点。

在这里插入图片描述

2.将快指针移动 n+1 步,为什么是n+1呢,因为只有这样同时移动的时候slow才能指向删除节点的上一个节点(方便做删除操作)

在这里插入图片描述

3.fast和slow同时移动,直到fast指向nullptr;此时慢指针指向需要删除元素的前一个元素。

在这里插入图片描述

4.删除慢指针指向的下一个节点。

在这里插入图片描述

代码

/*
 * @lc app=leetcode.cn id=19 lang=cpp
 *
 * [19] 删除链表的倒数第 N 个结点
 */

// @lc code=start
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        //根据题目要求,不用担心n的值超出范围
        ListNode* preHead = new ListNode(0,head);//创建一个虚拟头节点
        ListNode* fast = preHead;//创建一个快指针
        ListNode* slow = preHead;//创建一个慢指针
        n++;
        while(n-- && fast != nullptr)
            fast = fast->next;
        while(fast != nullptr)
        {
            fast = fast->next;
            slow = slow->next;
        }
        ListNode* temp = slow->next;//存储要删除元素的位置
        slow->next = slow->next->next;//删除元素
        delete temp;//清理内存
        return preHead->next;
    }
};
// @lc code=end

160.链表相交-面试题

整体思路

1.curA指向链表A的头结点,curB指向链表B的头结点。

在这里插入图片描述

2.求出两个链表的长度,并求出两个链表长度的差值;让curA移动到,和curB 尾巴对齐的位置。

在这里插入图片描述

3.比较curA和curB是否相同,如果不相同,同时向后移动curA和curB,如果遇到curA == curB,则找到交点。否则循环退出返回空指针。

代码

/*
 * @lc app=leetcode.cn id=160 lang=cpp
 *
 * [160] 相交链表
 */

// @lc code=start
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        ListNode* curA = headA;//链表A的索引指针
        ListNode* curB = headB;//链表B的索引指针
        int lenA = 0;
        int lenB = 0;
        //先求得链表A的长度
        while(curA != nullptr)
        {
            lenA++;
            curA = curA->next;
        }
        //先求得链表B的长度
        while(curB != nullptr)
        {
            lenB++;
            curB = curB->next;
        }
        curA = headA;//重新为curA赋值
        curB = headB;//重新为curB赋值      
        //让A指向长度较长链表的链表
        if(lenA < lenB)
        {
            swap(lenA, lenB);
            swap(curA, curB);
        }        
        //求长度差
        int n = lenA - lenB;
        //链表A和链表B尾巴上对齐
        while(n--)
            curA = curA->next;
        //链表A和链表B尾巴上的元素一个一个对应,如果指针相等就返回位置,如果不等就更新curA和curB
        while(curA != nullptr)
        {
            if(curA == curB)
            {
                return curA;
            }
            curA = curA->next;
            curB = curB->next;
        }
        //没有找到指针相等,就返回nullptr
        return nullptr;
    }
};
// @lc code=end

142.环形链表II

判断链表是否环

快指针和慢指针:快指针走得比较快,在环里面转圈圈;慢指针走得比较慢,与快指针在环中相遇了。

为什么一定会相遇?

快指针每次走两个节点,慢指针每次走一个节点;如果有环的话,快指针和慢指针一定会相遇,相当于是快指针去追慢指针(快指针一个一个节点去靠近慢指针。)。(但是如果快指针每次走三个节点,慢指针每次走一个节点的话,就有可能会错过,快指针跳过慢指针。)

找到环的入口

在这里插入图片描述

当发现链表中有环之后,如上图所示,slow指针走过的距离为x+y,fast指针走过的距离为:x+y+n(y+z),其中n为快指针在环中转的圈数。由于快指针速度为慢指针的两倍,因此可列式子:
2 ( x + y ) = x + y + n ( y + z ) = = > x + y = n ( y + z ) = = > x = n ( y + z ) − y = = > x = ( n − 1 ) ( y + z ) + z 2(x+y) = x+y+n(y+z) \\==> x+y = n(y+z) \\==> x = n(y+z) - y \\==> x = (n-1)(y+z) + z 2(x+y)=x+y+n(y+z)==>x+y=n(y+z)==>x=n(y+z)y==>x=(n1)(y+z)+z
由此可见,不管n为多少,不管快指针转多少圈追上慢指针,x一定等于z。

代码

/*
 * @lc app=leetcode.cn id=142 lang=cpp
 *
 * [142] 环形链表 II
 */

// @lc code=start
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        ListNode* fast = head;
        ListNode* slow = head;
        ListNode* index1, index2;

        while(fast != nullptr && fast->next != nullptr)//由于fast每次走两个节点,因此要检查它指向的下一个节点是否为nullptr
        {
            fast = fast->next->next;//快指针两个两个节点跑
            slow = slow->next;//慢指针一个一个节点跑
            if(fast == slow)//当快指针追上慢指针的时候,说明存在环
            {
                //此时就开始寻找环的入口
                ListNode* index1 = fast;
                ListNode* index2 = head;
                while(index1 != index2)
                {
                    index1 = index1->next;
                    index2 = index2->next;
                }
                return index1;
            }
        }
        return nullptr;
    }
};
// @lc code=end

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

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

相关文章

偏微分方程重要的前置知识

现在觉得很dog 开学期末考试正好美赛。无法评论&#xff0c;无法评论。乐淘淘&#xff0c;乐淘淘。期末考试不要延迟&#xff0c;求求了或者不安排在下学期第一周也可以。。。。反正求求了&#xff0c;美赛机会难得当然&#xff0c;如果是偏微分方程的问题的话&#xff0c;其实…

springboot连接Oracle的注意点(数据库信息配置、主键精度问题、OJDBC jar包、Oracle主键自增问题)

开篇废话&#xff1a;&#xff08;前段时间因为太忙没有坚持写博客&#xff0c;导致很久没有更新&#xff0c;今天终于忙里偷闲写上一篇&#xff09; 最近做了一个项目&#xff0c;数据库用的是Oracle&#xff0c;由于之前一直用的是MySQL&#xff0c;所以在一些细节配置上不是…

详细教你用NPS搭建内网穿透服务

文章目录 前言一、NPS概述 NPS的原理 二、NPS服务器搭建 1、下载软件2、云服务器配置 2.1、防火墙配置2.2、用WinSCP远程上传服务文件2.3、使用SSH终端安装启动2.4、修改配置文件 三、客户端连接总结 前言 相信大家外出旅游或者出差都是背着轻薄本&#xff0c;如果空闲之余想…

【Dubbo3高级特性】「实战开发」适配日志框架并支持运行时动态切换使用的日志框架开发实战

日志框架适配及运行时管理 本节内容主要是针对于如何在Dubbo中适配日志框架并支持运行时动态切换使用的日志框架&#xff0c;首先前提是需要进行启动我们Dubbo服务的Qos服务&#xff0c;它主要用于作为我们的操作对应的日志切换的功能实现机制 特性说明 日志框架适配&#x…

MATLB|基于matpower优化调度的风力模型预测

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清…

T6300A 网络综合测试仪 以太网数据 千兆以太网测试仪

一款功能强大、便携式、方便使用、价格便宜的高性价比手持式以太网测试仪是企业中网络管理和维护人员的刚需仪器。好的以太网测试仪可以帮助工作人员迅速解决网络不通、网速慢、丢包、延迟等问题。 当今以太网测试仪市场参差不齐&#xff0c;说的功能一个比一个强&#xff0c;…

【轻松掌握C语言】动态内存管理

目录 一、为什么存在动态内存分配 二、动态内存函数 1、malloc函数 (1)函数的用途 (2)函数的使用 2、free函数 (1)函数的用途 (2)函数的使用 3、calloc函数 (1)函数的用途 (2)函数的使用 4、realloc函数 (1)函数的用途 (2)函数的使用 三、常见的动态内存错误 1、对NULL指针的解…

【小f的刷题笔记】(JS)链表 - 单链表的倒数第 k 个节点 LeetCode19 单链表的中点 LeetCode876

【链表】 一、单链表的倒数第 k 个节点&#xff1a; ✔ 要求&#xff1a;只遍历一遍&#xff0c;链表有多长未知 LeetCode19 链接&#xff1a; 19.删除链表的倒数第N个结点 题目&#xff1a; 思路&#xff1a; 因为没有给头结点&#xff0c;我们就先定义一个哑结点&#…

从对称加密和非对称加密讲解HTTP到HTTPS的发展思路

一、传统的HTTP协议 传统的http在进行网络数据传输时&#xff0c;数据信息都是明文的&#xff0c;因此就很容易出现数据在网络的传输过程&#xff08;中间路由过程&#xff09;数据被监听或者窃取、替换的危险。因此http是一种不安全的传输协议。 那么就需要对数据进行加密。…

网络编程与通信原理

总感觉这个概念&#xff0c;和研发有点脱节&#xff1b; 一、基础概念 不同设备之间通过网络进行数据传输&#xff0c;并且基于通用的网络协议作为多种设备的兼容标准&#xff0c;称为网络通信&#xff1b; 以C/S架构来看&#xff0c;在一次请求当中&#xff0c;客户端和服务端…

物联网开发笔记(59)- 使用Micropython开发ESP32开发板之控制合宙4g Air724U模块

一、目的 这一节我们学习如何使用我们的ESP32开发板来控制合宙4g Air724U模块。 二、环境 ESP32 合宙4g Air724U模块 Thonny IDE 几根杜邦线 接线方法&#xff1a; 注意连接方式&#xff1a; ESP32的RX2----->4G模块的TX ESP32的TX2----->4G模块的RX 三、介绍 1&…

JSP ssh机房学生上机管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 JSP SSH机房学生上机管理系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采 用B/S模式开发。开发环境为TOMCA…

SpringBoot 注解方式快速整合Mybatis

序言&#xff1a;使用MyBatis3提供的注解可以逐步取代XML&#xff0c;例如使用Select注解直接编写SQL完成数据查询&#xff0c;使用SelectProvider高级注解还可以编写动态SQL&#xff0c;以应对复杂的业务需求。 一. 基础注解 MyBatis 主要提供了以下CRUD注解&#xff1a; Se…

Spring Cloud Alibaba Nacos Config - - - >@RefreshScope动态获取刷新后的配置内容

初学者不知道有没有这个疑惑&#xff1a;我明明已经在 SpringBoot 应用的 bootstrap.yml 配置文件中&#xff0c;通过 spring.cloud.nacos.config.refresh-enabledtrue 开启配置文件动态刷新了&#xff0c;为什么在 Controller 控制类中使用 Value 注解无法获取到配置文件修改后…

猿如意中的【取色器】效率工具详情介绍

目录 一、工具名称 二、下载安装渠道 2.1 什么是猿如意&#xff1f; 2.2 如何下载猿如意&#xff1f; 2.3 如何在猿如意中下载取色器&#xff1f; 三、取色器介绍 四、软件安装过程 五、软件界面 六、取色器功能特点介绍 七、取色器使用/体验感受 一、工具名称…

Typescript学习(第三弹)

泛型 定义 不预先确定的数据类型&#xff0c;具体的类型在使用的时候才确定&#xff0c;把泛型理解为代表类型的参数 泛型函数 泛型函数类型 泛型接口 引用泛型接口要指定一个类型&#xff0c;否则会报错 或者在泛型接口里指定一个默认类型 泛型类 泛型放在类的后面这样…

项目上线后我是如何通过慢查询和索引让系统快起来的

1、前言 最近对mysql的操作比较多一些&#xff0c;主要是项目上线以后&#xff0c;难免会有一些数据上的问题。开始的时候还主要由后端来处理&#xff0c;后面数据问题确实比较多&#xff0c;于是我就找后端要来服务器的账号密码&#xff0c;连上数据库顺便来看看数据的问题。…

C语言小项目-----员工管理系统

目录 项目要求&#xff1a; 考虑点&#xff1a; 实现过程 所用知识点 最终效果如下&#xff1a; 项目要求&#xff1a; 考虑点&#xff1a; 服务器端用select监听多个客户端&#xff0c;考虑点在于&#xff0c;公司内部的系统管理系统&#xff0c;不会有太多人每天都登陆&a…

【web前端开发】CSS的元素显示模式

前言 元素的显示模式可以更好的帮助我们布局页面,了解元素的显示模式,可以让我们布局页面时更加简单清晰 什么是元素显示模式 元素显示模式就是元素(标签)以什么样的方式进行显示 HTML元素一般分为块元素和行内元素两种类型 以下是块级元素和行内元素在网页中的显示: 块元…

3.神经网络-深度学习入门

3.神经网络 深度学习入门 本文的文件和代码链接&#xff1a;github地址 1.激活函数 sigmoid h(x)11e−xh(x) \frac{1}{1 e^{-x}} h(x)1e−x1​ def sigmod(x):return 1 / (1 np.exp(-1 * x))ReLU h(x){x:x>00:x≤0h(x) \left\{ \begin{array}{lr} x & : x > …