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

两两交换链表中的节点

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

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

/**
 * 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.mfbz.cn/a/9257.html

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

相关文章

阿里9年测试经验告诉你:作为一名年薪40w自动化测试需要具备那些能力

前言 前段时间张同学问我说&#xff1a;我已经功能测试2年多了&#xff0c;在功能测试的阶段中也一直在自学自动化测试&#xff0c;有了一定的代码基础还学习了很多的工具&#xff0c;问题是我不知道自动化测试到底需要具备什么样的能力。 我相信有很多小伙伴也是在思索这个问…

计算机组成的基本认识

计算机——> 数值计算——> 处理电信号——> 基本单元&#xff08;逻辑元件&#xff09; 电子管——> 晶体管——>中小规模集成电路 ——>大规模&#xff0c;超大规模集成电路 机器字长&#xff1a;计算机一次整数运算所能处理的二进制位数 解析存储器中的程…

这家年销售额309亿的Tier 1,要谈一场千亿新生意

跨入2023年&#xff0c;智能汽车软件赛道更热闹了。 相较于传统汽车开发模式&#xff0c;软件属于分布式ECU工程开发的一部分&#xff0c;由一级供应商作为黑盒提供&#xff0c;软件开发成本等被认为是硬件系统成本的一部分&#xff0c;没有实现单独定价。 如今&#xff0c;“…

如何在windows/linux下启动OpenOffice

上面一篇文章使用openOffice来实现预览word、excel、pdf、txt等的功能时&#xff0c;发现openOffice没有启动&#xff0c;也怕有些同学安装后不会启动&#xff0c;所以便写下这一篇文章&#xff0c;来为大家说明如何启动openOffice&#xff0c;上一篇讲的如何下载安装openOffic…

2.5 函数的微分

思维导图&#xff1a; 学习目标&#xff1a; 我认为学习函数的微分需要以下几个步骤&#xff1a; 熟练掌握导数的定义和基本性质&#xff0c;包括求导法则和高阶导数的概念。学习一些重要的函数的导数&#xff0c;例如多项式函数、三角函数、指数函数和对数函数等。这些函数的…

CSDN——Markdown编辑器——官方指导

CSDN——Markdown编辑器——官方指导欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表…

Node.js -- http模块

1. 什么是http模块 在网络节点中&#xff0c;负责消费资源的电脑&#xff0c;叫客户端&#xff1b;负责对外提供网络资源的电脑&#xff0c;叫做服务器。 http模块是Node.js官方提供的&#xff0c;用来创建web服务器的模块。通过http模块提供的http.createServer()方法&#…

手写一个Promise

Promise Promise是一个对象&#xff0c;用于解决异步变成的问题&#xff0c;由传统的异步回调为服务端立即调用优化为使用者者掌握回调主动权。 比如传统的JSONP&#xff0c;如下&#xff0c;在请求路由里添加回调函数&#xff0c;由接收请求的一方来调用请求&#xff0c;使用…

kafka笔记

消息队列 场景模式基础架构发送原理异步发送同步发送分区生产者提高吞吐量&#xff1a;数据可靠性ack应答数据重复幂等性事务数据有序数据乱序broker工作流程follower故障leader故障数据查找文件清除高效读写消费者流程消费者组初始化分区分配策略自动提交offset手动提交指定位…

Kubernetes调度器源码学习(一):调度器工作原理、调度器启动流程、调度队列

本文基于Kubernetes v1.22.4版本进行源码学习 1、调度器工作原理 1&#xff09;、调度流程 kube-scheduler的主要作用就是根据特定的调度算法和调度策略将Pod调度到合适的Node节点上去&#xff0c;是一个独立的二进制程序&#xff0c;启动之后会一直监听API Server&#xff0…

thanos prometheus 的高可用、长期存储二进制部署

1.简介 http://thanos.io/ thanos 是具有长期存储功能的开源、高可用性 Prometheus的集群组件。 全局查询视图 跨多个 Prometheus 服务器和集群查询指标 无限保留 使用对象存储扩展系统&#xff0c;不限时间保留指标。 Prometheus兼容 兼容 Prometheus api&#xff0c;用于…

FPGA时序知识点(基本方法总结就两点:1.降低时钟频率2.减小组合逻辑延迟(针对Setup Slack公式来的)

1.我们说的所有时序分析都是建立在同步电路的基础上的&#xff0c;异步电路不能做时序分析&#xff08;或者说只能做伪路径约束&#xff08;在设伪路径之前单bit就打拍&#xff0c;多bit就异步fifo拉到目的时钟域来&#xff09;&#xff09;。——FPGA 设计中寄存器全部使用一个…

Spring的事务

(1) 事务的定义 事务就是用户定义的一系列数据库操作&#xff0c;这些操作可以视为一个完成的逻辑处理工作单元&#xff0c;要么全部执行&#xff0c;要么全部不执行&#xff0c;是不可分割的工作单元。 (2)事务的使用&#xff1a; begin transaction commit rollback. begin …

谈谈软件系统重构

「头条关注【Java思享汇】&#xff0c;面试、各种技术栈、架构设计持续更新中&#xff5e;」 分享初衷&#xff1a;工作几年之后基本都会经历过大大小小的系统重构&#xff0c;笔者经历过单体应用拆分微服务的系统重构&#xff0c;数据异构&#xff0c;业务系统重构。借助此次…

总结819

学习目标&#xff1a; 4月&#xff08;复习完高数18讲内容&#xff0c;背诵21篇短文&#xff0c;熟词僻义300词基础词&#xff09; 第二周&#xff1a; 学习内容&#xff1a; 暴力英语&#xff1a;早上背诵《think different》记150词&#xff0c;默写了两篇文章&#xff0c…

Java中的Iterator底层原理实现

两个抽象方法 Iterator主要有两个抽象方法&#xff0c;让子类实现。 hasNext()用来判断还有没有数据可供访问。next()方法用于访问集合的下一个数据。 这两个方法不像List的get()那样依赖索引获取数据&#xff0c;也不像Queue的poll方法那样依赖特定规则获取数据。 迭代器的…

3月更新 | Visual Studio Code Python

我们很高兴地宣布&#xff0c;2023年3月版 Visual Studio Code Python 和 Jupyter 扩展现已推出&#xff01; 此版本包括以下改进&#xff1a; 后退按钮和取消功能添加到创建环境命令默认情况下&#xff0c;Python 扩展不再附带 isortJupyter 笔记本中内核选择的改进Python P…

代码随想录Day49

今天继续学习动规解决完全背包问题。 322.零钱兑换 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c;…

java 线段树

线段树是一种二叉搜索树&#xff0c;什么叫做二叉搜索树&#xff0c;首先满足二叉树&#xff0c;每个结点度小于等于二&#xff0c;即每个结点最多有两颗子树&#xff0c;何为搜索&#xff0c;我们要知道&#xff0c;线段树的每个结点都存储了一个区间&#xff0c;也可以理解成…

【JavaWeb】8—过滤器

⭐⭐⭐⭐⭐⭐ Github主页&#x1f449;https://github.com/A-BigTree 笔记链接&#x1f449;https://github.com/A-BigTree/Code_Learning ⭐⭐⭐⭐⭐⭐ 如果可以&#xff0c;麻烦各位看官顺手点个star~&#x1f60a; 如果文章对你有所帮助&#xff0c;可以点赞&#x1f44d;…
最新文章