day-004-链表-两两交换链表中的节点、删除链表的倒数第N个节点、链表相交、环形链表II

news2024/11/25 9:35:07

两两交换链表中的节点

题目建议:用虚拟头结点,这样会方便很多。

题目链接/文章讲解/视频讲解

/**
 * 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) {
        if ( head == NULL ) return head;
        if ( head->next == NULL ) return head;
        ListNode* dummyHead = new ListNode();
        dummyHead->next = head;
        ListNode* cur = dummyHead;
        while (cur->next) {
            if (cur->next->next) {
                ListNode* temp = cur->next;
                cur->next = temp->next;
                temp->next = temp->next->next;
                cur->next->next = temp;
                cur = temp;
            }
            else {
                cur = cur->next;
            }
        }
        head = dummyHead->next;
        delete dummyHead;
        return head;

    }
};

思路

没有太多难度,按自己的习惯可能更喜欢建立四个指针变量保存所有涉及到的结点。

时间复杂度O(n)
空间复杂度O(1)

注意

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

双指针的操作,要注意,删除第N个节点,那么我们当前遍历的指针一定要指向 第N个节点的前一个节点,建议先看视频。

题目链接/文章讲解/视频讲解

/**
 * 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* dummyHead = new ListNode(0);
        dummyHead->next = head;
        ListNode* slow = dummyHead;
        ListNode* fast = dummyHead;
        for (int i = 0; i < n; i++) {
            fast = fast->next;
        }
        while (fast->next) {
            fast = fast->next;
            slow = slow->next;
        }
        ListNode* temp = slow->next;
        slow->next = temp->next;
        delete temp;
        head = dummyHead->next;
        delete dummyHead;
        return head;
    }
};

思路

二刷还是有印象双指针的,还是挺快的。

时间复杂度O(n)
空间复杂度O(1)

注意

由于有dummyHead,slow本身就在dummyHead开始,所以快指针先走n个,不需要多走一个,slow就在需要删除的结点的前一个了。

面试题 02.07. 链表相交

本题没有视频讲解,大家注意 数值相同,不代表指针相同。

题目链接/文章讲解/视频讲解

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
private:
    int getListSize(ListNode* head) {
        int size = 0;
        ListNode* cur = head;
        while (cur) {
            size++;
            cur = cur->next;
        }
        return size;
    }

public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        int size_a, size_b;
        size_a = getListSize(headA);
        size_b = getListSize(headB);
        if (size_a < size_b) {
            swap(size_a, size_b);
            swap(headA, headB);
        }
        ListNode* cur = headA;
        for (int i = 0; i < size_a - size_b; i++) {
            cur = cur->next;
        }
        ListNode* cur_b = headB;
        for (int i = 0; i < size_b; i++) {
            if (cur == cur_b) return cur;
            cur = cur->next;
            cur_b = cur_b->next;
        }
        return NULL;
        
    }
};

思路

相同指针有相同地址,后续的节点都相同,所以可以从后往前想。在相交节点之后他们一定有相同的节点数量。

时间复杂度O(n)
空间复杂度O(1)

注意

注意要对长链表和短链表做适合代码逻辑的交换,以统一代码内容。
交换用swap()

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) {
        ListNode* slow = head;
        ListNode* fast = head;
        while (fast != NULL && fast->next != NULL){
            slow = slow->next;
            fast = fast->next->next;
            if (slow == fast) {
                // x + y + n (y + z) = 2 (x +y)
                // n (y + z) = x +y
                // 当 n 取 1:z = x
                slow = head;
                while (slow != fast) {
                    slow = slow->next;
                    fast = fast->next;
                }
                return slow;
            }
        }

        return NULL;
        
    }
};

思路

这题还是需要最好画个图来做的,一开始总是默认想着在相交点相遇,不太清醒。画个图,在环中间相遇,就很清晰。
环

// x + y + n (y + z) = 2 (x +y)
// n (y + z) = x +y
// 当 n 取 1:z = x

时间复杂度O(n)
空间复杂度O(1)

注意

要多画图,多数学公式推导。

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

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

相关文章

手麻系统源码,手术麻醉管理系统源码,二次开发方便快捷

手术麻醉管理系统源码&#xff0c;手麻系统源码&#xff0c;C# .net 桌面软件 C/S版 手术麻醉管理系统采用下拉式汉化菜单&#xff0c;界面友好&#xff0c;实用性强&#xff0c;设有与住院、病区、药房等系统的软件接口。 文末获取联系&#xff01; 开发语言&#xff1a;C# …

4.1 随机变量的数学期望

学习目标&#xff1a; 如果我想学习随机变量的数学期望&#xff0c;我可能会采取以下步骤&#xff1a; 掌握概率论基础知识&#xff1a;在学习随机变量的期望之前&#xff0c;我需要了解概率论的基本概念&#xff0c;例如概率、随机变量、概率密度函数等。 学习数学期望的定义…

算法总结---最常用的五大算法(算法题思路)

一、总结 一句话总结&#xff1a; 【明确所求&#xff1a;dijkstra是求点到点的距离&#xff0c;辅助数组就是源点到目标点的数组】 【最简实例分析&#xff1a;比如思考dijkstra&#xff1a;假设先只有三个点】 1、贪心算法是什么&#xff1f; 当前看来最好的选择 局部最…

第二章(2):从零开始掌握PyTorch基础知识,打造NLP学习利器

第二章&#xff08;2&#xff09;&#xff1a;从零开始掌握PyTorch基础知识&#xff0c;打造NLP学习利器&#xff01; 目录第二章&#xff08;2&#xff09;&#xff1a;从零开始掌握PyTorch基础知识&#xff0c;打造NLP学习利器&#xff01;1. Pytorch基础1.1 Pytorch安装1.1.…

计算机网络考试复习——第四章 4.1 4.2.1 4.2.2

网络层传输的单位是IP数据报 4.1 网络层的几个重要概念 网络层提供的两种服务&#xff1a;网络层应该向运输层提供怎样的服务&#xff1f;面向连接还是无连接&#xff1f; 在计算机通信中&#xff0c;可靠交付应当由谁来负责&#xff1f;是网络还是端系统&#xff1f; 面向连…

X79G Xeon 2630v2 电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。&#xff08;下载请直接百度黑果魏叔&#xff09; 硬件型号驱动情况 主板X79G 处理器Intel Xeon 2630v2已驱动 内存32g (16*2 2666MHZ)已驱动 硬盘Intel 760p 512GB已驱动 显卡RX 470已驱动 声卡瑞昱 英特尔 High De…

硬件外设使用方法——GPIO

【硬件外设使用】——GPIO用法GPIO基本概念GPIO应用pyb与micropython什么是pyb什么是micropythonpyb与micropython关系GPIO在micropython中的用法什么是pyb库pyb库中的GPIO用法micropython下的GPIO用法经过与硬件群的小伙伴商量&#xff0c;决定直接找个板子讲实战了- -。 本部…

qt动态加载qss 更好的推荐方式

1、编写QRC资源文件[window和linux通用] 2、过rcc程序生成rcc资源文件 生成2进制数据&#xff1a; 通过控制台窗口执行以下命令&#xff0c;会把qrc中的资源文件写成二进制数据保存 rcc.exe -binary .\resuorce.qrc -o .\resuorce.rcc 生成16进制数据&#xff1a; 通过控制台窗…

JavaSE学习进阶day03_02 内部类

第二章 内部类&#xff08;最难的&#xff09; 2.1 概述 2.1.1 什么是内部类 将一个类A定义在另一个类B里面&#xff0c;里面的那个类A就称为内部类&#xff0c;B则称为外部类。可以把内部类理解成寄生&#xff0c;外部类理解成宿主。 2.1.2 什么时候使用内部类 一个事物内…

STM32驱动SIM900A短信模块

简介&#xff1a;STM32F103C8T6驱动SIM900A短信模块源码介绍。 开发平台&#xff1a;KEIL ARM MCU型号&#xff1a;STM32F103C8T6 传感器型号&#xff1a;SIM900A 特别提示&#xff1a;驱动内可能使用了某些其他组件&#xff0c;比如delay等&#xff0c;在文末外设模板下载…

协议篇之以太网协议基础概念

协议篇之以太网协议基础概念一、写在前面二、什么是以太网三、以太网TCP/IP协议分层四、MAC地址与IP地址五、写在后面一、写在前面 在学习了串口协议后&#xff0c;发现通过串口传输数据&#xff0c;数据传输的速率较慢&#xff0c;无法符合高速率传输场景下的要求&#xff0c;…

PXE+Kickstart自动化安装操作系统

文章目录PXEKickstart 完美自动化部署系统理论知识&#xff1a;1、PXE2、DHCP实践实验&#xff1a;1、DHCP服务器配置2、TFTP服务器配置3、HTTP服务器安装4、PXE配置5、Kickstart实践配置PXEKickstart 完美自动化部署系统 理论知识&#xff1a; 无人值守原理&#xff1a;Kick…

飞行机器人专栏(十一)-- 空中机器人综合健康管理系统

目录 一. 综合健康管理系统架构 1. 系统架构&#xff1a; 2. 故障诊断算法&#xff1a; 3. 预测维护策略&#xff1a; 4. 安全与隐私&#xff1a; 5. 用户友好性&#xff1a; 6. 模块化与可扩展性&#xff1a; 7. 与其他系统集成&#xff1a; 8. 考虑环境因素&#xf…

获取文件内容方法使用说明

一、是什么&#xff1f; sikuli设备新增了一个获取文件内容的方法&#xff0c;该方法可以传入指定路径读取文件内容&#xff0c;方便后续做打印&#xff0c;对比等工作 二、怎么用&#xff1f; 1.文件绝对路径&#xff0c;例如 windows&#xff1a;F:\cn_sonic\sonic-agent…

abbyy finereader15下载安装使用及功能介绍

今天给大家分享一款一款真正的专业OCR&#xff0c;它不仅支持多国文字&#xff0c;还支持彩色文件识别、自动保留原稿插图和排版格式以及后台批处理识别功能&#xff0c;使用者再也不用在扫描软件、OCR、WORD、EXCEL之间换来换去了&#xff0c;处理文件会变的就像打开已经存档的…

RabbitMQ安装教程(Mac)

1、RabbitMQ是采用Erlang语言开发的&#xff0c;所以系统环境必须提供Erlang环境。 brew install rabbitmq前提必须是mac安装了HomeBrew&#xff08;软件包管理系统&#xff09;&#xff0c;以下都是基于mac版本的。 等大概十几分钟 brew services start rabbitmq;RabbitMQWeb…

第09章_性能分析工具的使用

第09章_性能分析工具的使用 ​ 在数据库调优过程中&#xff0c;我们的目标就是响应时间更快&#xff0c;吞吐量更大。利用宏观的监控工具和微观的日志分析可以帮我们快速找到调优思路和方式。 1. 数据库服务器的优化步骤 ​ 当我们遇到数据库调优问题的时候&#xff0c;该如…

Rabbitmq学习笔记教程-尚硅谷

Rabbitmq学习笔记 &#xff08;尚硅谷&#xff09; 尚硅谷 rabbitmq 教程 1.MQ 的概念 1.1 什么是 MQ? 存放消息的队列&#xff0c;互联网架构中常见的一种服务与服务之间通信的方式。 1.2 为什么要用 MQ? 三大好处&#xff0c;削峰&#xff0c;解耦&#xff0c;异步。…

1小时学会CSS - 中

接第一课&#xff0c; 1小时学会CSS - 上&#xff0c;大家还记得前面说的一个概念&#xff0c;CSS 层叠样式吗&#xff1f;很多小伙伴都无法理解。 这里再详细说说&#xff0c;什么是CSS 层叠样式&#xff1f;CSS 层叠样式指的是上级标签的样式会自动继承给其所有的下级标签。…

爬虫日常练习-艾图网多页面图片爬取

文章目录前言页面分析设计代码前言 欢迎回来兄弟们&#xff0c;想必各位都已经过了一遍上篇文章了吧&#xff0c;没过的兄弟们可以移步上篇文章指点一二&#xff0c;链接: 爬虫日常练习-艾图网单页面图片爬取 感谢xdm 昨天的内容想必已经挑起了大家的胃口&#xff0c;我们趁…