代码随想录算法训练营第17期第4天(5休息) | 24. 两两交换链表中的节点、19. 删除链表的倒数第 N 个结点、面试题 02.07. 链表相交、​​​​​​142. 环形链表 II

news2024/9/24 13:15:29

目录

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

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

面试题 02.07. 链表相交

​​​​​​142. 环形链表 II


这题不是很难,目前除了从【.】变成了【->】之外,python和C++也没啥区别

另外就是对虚拟头结点的掌握了

/**
 * 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* dummy = new ListNode(0);
        dummy->next = head;
        ListNode* cur = dummy;
        while (cur->next != nullptr and cur->next->next != nullptr){
            ListNode* tmp1 = cur->next;
            ListNode* tmp2 = cur->next->next->next;
            cur->next = cur->next->next;
            cur->next->next = tmp1;
            tmp1->next = tmp2;
            cur = cur->next->next;
        }
        return dummy->next;
    }
};

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

双指针的经典应用,确实经典

写完我去看了一下卡哥的思路,二者基本一致,不过他多向前移动了一步,所以他的第二个while的条件只要cur != nullptr就可以了,这个小不同,不影响

/**
 * 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) {
        ListNode* dummy = new ListNode(0);
        dummy->next = head;
        ListNode* cur = dummy;
        ListNode* tmp = dummy;
        while (n--){
            cur = cur->next;
        }
        while (cur->next != nullptr){
            tmp = tmp->next;
            cur = cur->next;
        }
        tmp->next = tmp->next->next;
        return dummy->next;        
    }
};

面试题 02.07. 链表相交

这道题主要注意下面两点

  1. 题目要求【函数返回结果后,链表必须 保持其原始结构】,所以在计算完链表的长度后,需要重新复制指针指向原headA,headB,不能直接对headA和headB进行操作
  2. 卡哥的解法是将长的置换为A,使用了swap,我这边没有,用的if else判断,当然,这个不是核心,可以学习一下
/**
 * 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* cur_a = headA;
        ListNode* cur_b = headB;
        int cnt_a = 0;
        int cnt_b = 0;
        while (cur_a != NULL){
            cnt_a++;
            cur_a = cur_a->next;
        }
        while (cur_b != NULL){
            cnt_b++;
            cur_b = cur_b->next;
        }
        cur_a = headA;
        cur_b = headB;
        if (cnt_a > cnt_b){
            int diff = cnt_a - cnt_b;
            while(diff--){
                cur_a = cur_a->next;
            }
        }
        else{
            int diff = cnt_b - cnt_a;
            while(diff--){
                cur_b = cur_b->next;
            }
        }
        while (cur_a != NULL){
            if(cur_a == cur_b){
                return cur_a;
            }
            else{
                cur_a = cur_a->next;
                cur_b = cur_b->next;
            }
        }
        return NULL;

    }
};

​​​​​​142. 环形链表 II

这道题还是蛮难的,主要难在找相遇点

判断环:快慢指针,每当慢指针前进一步,快指针前进两步。如果快指针遇到空指针,说明无环;如果快指针遇到慢指针,说明存在环

判断入口:从头结点出发一个指针,从相遇节点 也出发一个指针,这两个指针每次只走一个节点, 那么当这两个指针相遇的时候就是 环形入口的节点。(可以理解为构建两轮相遇

注意:这题就不用设置虚拟头指针了

/**
 * 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) {
        if (head == NULL){
            return head;
        }
        ListNode* fast = head;
        ListNode* slow = head;
        while (fast->next != NULL && fast->next->next != NULL){
            fast = fast->next->next;
            slow = slow->next;
            if (fast == slow)
            {
                ListNode* index1 = slow; //这里其实没必要设定index1,直接用slow就行
                ListNode* index2 = head;
                while(index1 != index2){
                    index1 = index1->next;
                    index2 = index2->next;
                }
                return index1;
            }
        }
        return NULL;        
    }
};

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

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

相关文章

爬虫小白入门在服务器上-部署爬虫或者开服务接口并供给他人访问

目录 一、准备工作-服务器1、先准备一个服务器(以阿里云为例子)2、开通服务端口号访问权限 二、准备工作-Xshell登录服务器1、xshell基本登录操作2、xftp基本操作 三、部署代码到服务器上1、部署一个python爬虫脚本在服务器上定时运行等2、部署一个pytho…

Java-API简析_占位符类(基于 Latest JDK)(浅析源码)

【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://blog.csdn.net/m0_69908381/article/details/131504916 出自【进步*于辰的博客】 因为我发现目前,我对Java-API的学习意识比较薄弱…

区块链开发:JS/TS本地|项目环境搭建

区块链开发:JS/TS本地|项目环境搭建 本地环境搭建VSCode Solidity扩展全局安装Solc,corepackVSCode配置本地Solc安装Ganache搭建JS虚拟环境 项目测试安装依赖编写代码部署合约test_blockchain.ts 设置Script部署查看 报错说明1. Error:missing revert da…

【EasyX】使用C/C++实现 流星雨效果(配上详细注释解释)

🎊专栏【​​​​​​​EasyX】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【Love Story】 🥰大一同学小吉,欢迎并且感谢大家指出我的问题🥰 文章目录 🍔效果&#x…

RNN LSTM

参考资料: 《机器学习2022》李宏毅史上最详细循环神经网络讲解(RNN/LSTM/GRU) - 知乎 (zhihu.com) LSTM如何来避免梯度弥散和梯度爆炸? - 知乎 (zhihu.com) 1 RNN 的结构 首先考虑这样一个 slot filling 问题: 注意…

云解析DNS

云解析过程: DNS查询的结果通常会在本地域名服务器中进行缓存,如果本地域名服务器中有缓存的情况下,则会跳过如下DNS查询步骤,很快返回解析结果。下面的示例则概述了本地域名服务器没有缓存的情况下,DNS查询所需的8个步…

电路的组成和连接方式-通路、开路、短路

电路是电子设备中最基本的组成部分之一,它由各种电子元件组成,并通过连接方式构建成不同的电路结构。在电路设计和维护中,通路、开路和短路是常见的概念,它们分别代表了电路中不同的连接状态和故障情况。 工具认识: …

万能的微信小程序个人主页:商城系统个人主页、外卖系统个人主页、购票系统个人主页等等【全部源代码分享+页面效果展示+直接复制粘贴编译即可】

前言 以下给出来四个常见的小程序个人主页,分别是商城系统个人主页,外卖系统个人主页,挂号系统个人主页,电影购票系统个人主页。包括完整的页面布局代码,完整的样式代码。使用的时候,只需要将页面代码和样式代码复制到自己项目对应的页面即可。而且可以根据已有代码只需稍…

【机器学习】准确率、精确度、召回率和 F1 定义

一、说明 数据科学家选择目标变量后 - 例如他们希望预测电子表格中的“列”,并完成了转换数据和构建模型的先决条件,最后步骤之一是评估模型的性能。 二、混淆矩阵的模型 2.1 混淆矩阵 选择性能指标通常取决于要解决的业务问题。假设您的数据集中有 10…

电子时钟制作(瑞萨RA)(2)----使用串口进行程序烧写

概述 本篇文章主要介绍如何使用UART串口烧写程序到瑞萨芯片,并以实际项目进行演示。 硬件准备 首先需要准备一个开发板,这里我准备的是芯片型号R7FA2E1A72DFL的开发板: 视频教程 https://www.bilibili.com/video/BV1kX4y1v7tL/ 电子时钟制…

Symbol.for()

示例:Symbol() 和 Symbol.for(‘ ’)的区别 Symbol.for("foo"); // 创建一个 symbol 并放入 symbol 注册表中,键为 "foo" Symbol.for("foo"); // 从 symbol 注册表中读取键为"foo"的 symbolSymbol.for("b…

常见面试题之线程池

1. 说一下线程池的核心参数(线程池的执行原理知道嘛)? 线程池核心参数主要参考ThreadPoolExecutor这个类的7个参数的构造函数 corePoolSize 核心线程数目 maximumPoolSize 最大线程数目 (核心线程救急线程的最大数目) keepAliveTime 生存…

蘑菇车联用城市级落地讲述自动驾驶新故事

作者 | 魏启扬 来源 | 洞见新研社 “如果不能实现自动驾驶,特斯拉将一文不值”。 这是马斯克在接受媒体采访时的公开发言,这句话的语境是,特斯拉是自动驾驶坚实的拥护者,且一直在付诸行动。 可是特斯拉渐进式的单车智能路线&am…

【游戏逆向】探索可靠的线程检查方法

一、关键的线程检查 在对抗外挂和木马的方案中,不可能将所有的检查操作放在主线程中,因此,在方案中总有一个扫描线程或者环境检查线程必须保持工作,而它们也就成了外挂和木马的重要攻击目标,外挂和木马只要搞定了它们…

【高可用架构】聊聊故障和高可用架构设计

在架构设计中,高性能、高可用、可拓展以及安全等等有多种维度去判断架构的设计纬度,但是一般来说我们需要考虑具体的业务场景,去判断采用那种合适的架构方案,但是对于大多数的设计来说,都需要满足高性能、高可用。所以…

专科学历,有机会转行程序员吗?

你好,我是程序员晚枫,昨晚又1对1沟通了一位想转行程序员的朋友。 这位朋友是专科毕业,在电子厂干了2年多,感觉看不到希望,来找我咨询一下有没有转行程序员的可能性 学习计划。 我觉得他的情况和提问很有代表性&…

软件测试综述

概述 在不短不长的7年多研发生涯中,听过无数个软件测试概念:单元测试、功能测试、白盒测试、黑盒测试、自动化测试、契约测试、基准测试、性能测试、集成测试、渗透测试、接口测试、UI测试、端到端测试、E2E测试…… 恰逢在准备系统架构设计师软考高级…

我的创作纪念日-256天

机缘: 没有在csdn进行写作,我就不会认识更多对应领域的博主,并且也认识到了很多不同领域的博主这令我感到非常荣幸,能够加入到csdn。在分享交流的过程种我获得了: 实战项目中的经验分享日常学习过程中的记录通过文章进…

Ubuntu20.04安装arm-linux-gcc 4.3.2 (提供安装包)

⁡​​⁢‬‌​⁢‌⁡‍⁣⁤‬‌⁡⁢⁢‍⁡⁤​⁣‬‌‬‍⁤​⁤‌⁣⁤​⁤⁢‍⁢⁤‬⁣‬​‌Ubuntu20.04安装arm-linux-gcc 4.3.2 - 飞书云文档 (feishu.cn) CSDN编辑太丑了 转移阵地了

Google Colab:云端的Python编程神器

Google Colab,全名Google Colaboratory,是Google Research团队开发的一款云端编程工具,它允许任何人通过浏览器编写和执行Python代码。Colab尤其适合机器学习、数据分析和教育目的。它是一种托管式Jupyter笔记本服务,用户无需设置…