【算法刷题day4】Leetcode:24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II

news2024/11/15 12:03:22

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

文档链接:[代码随想录]
题目链接:24. 两两交换链表中的节点
状态:ok

题目:
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
注意:
1.题目的意思是不能更改链表中节点的val值,只能改变指针的方向
2.每一次循环都分为三步
3.采用虚拟头节点将对头节点的操作等价于其他节点。但是要注意定义一个节点记录头节点指针用于返回,否则会出现以下问题。
4.我用了双指针,但貌似没比较用两个指针
在这里插入图片描述
在这里插入图片描述

class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        ListNode* k = new ListNode(0);
        k -> next = head;
        ListNode* i = k;
        ListNode* j = head;
        while(i->next != nullptr && i->next->next != nullptr){
            i -> next = j -> next;
            ListNode* temp = j -> next -> next;
            j -> next -> next = j;
            j -> next = temp;
            i = j;
            j = j -> next;
        }
        return k -> next;
    }
};
class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        ListNode* dummyHead = new ListNode(0); // 设置一个虚拟头结点
        dummyHead->next = head; // 将虚拟头结点指向head,这样方便后面做删除操作
        ListNode* cur = dummyHead;
        while(cur->next != nullptr && cur->next->next != nullptr) {
            ListNode* tmp = cur->next; // 记录临时节点
            ListNode* tmp1 = cur->next->next->next; // 记录临时节点

            cur->next = cur->next->next;    // 步骤一
            cur->next->next = tmp;          // 步骤二
            cur->next->next->next = tmp1;   // 步骤三

            cur = cur->next->next; // cur移动两位,准备下一轮交换
        }
        return dummyHead->next;
    }
};

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

文档链接:[代码随想录]
题目链接:19.删除链表中的倒数第N个节点
状态:ok 双指针

题目:
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
注意:
1.本来想的是找快指针和慢指针的插值,当快指针移动到与慢指针距离达到一定长度时移动慢指针,但会出现快指针指向nullptr而慢指针少走一步的情况
在这里插入图片描述

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* node = new ListNode(0);
        node -> next = head;
        ListNode* lowindex = node;
        ListNode* fastindex = node;
        int l = 0, r = 0;
        while (fastindex != nullptr) {
                fastindex = fastindex->next;
                l++;
            while (l - r - 1 > n) {
                lowindex = lowindex->next;
                r++;
            }
        }
        ListNode* temp = lowindex->next;
        lowindex->next = lowindex->next->next;
        delete temp;
        return head;
    }
};

2.直接使快指针提前走几步之后快慢指针共同前进最简单。

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* node = new ListNode(0);
        node -> next = head;
        ListNode* lowindex = node;
        ListNode* fastindex = node;
        while (fastindex != nullptr && n--) {
            fastindex = fastindex->next;
           
        } 
        fastindex = fastindex -> next;
        while (fastindex !=nullptr) {
            fastindex = fastindex->next;
            lowindex = lowindex->next;      
        }
        ListNode* temp = lowindex->next;
        lowindex->next = lowindex->next->next;
        delete temp;
        return node->next;
    }
};

面试题02.07.链表相交

文档链接:[代码随想录]
题目链接:面试题02.07.链表相交
状态:ok

题目:
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。
注意:
1.比较的是节点不是节点的值
2.第一次遍历后需要把指针复原并且要在交换两条链表之前复原指向头节点

class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        ListNode* curA = headA;
        ListNode* curB = headB;
        int lenA = 0;
        int lenB = 0;
        while(curA != nullptr){
            lenA++;
            curA = curA -> next;
        }
        while(curB != nullptr){
            lenB++;
            curB = curB -> next;
        }
        curA = headA;
        curB = headB;
        if(lenA < lenB){
            swap(lenA,lenB);
            swap(curA,curB);
        }
        while((lenA-lenB) > 0){
            curA = curA -> next;
            lenA--;
        }
        while(curA != nullptr){
            if(curA == curB){
                return curA;
            }
            curA = curA -> next;
            curB = curB -> next;
        }
        return NULL;
    }
};

142.环形链表

文档链接:[代码随想录]
题目链接:142.环形链表
状态:记住推导过程

题目:
给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。
不允许修改 链表。
注意:
1.公式推导要理解

class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        ListNode* fast = head;
        ListNode* slow = head;
        while(fast != NULL && fast->next != NULL) {
            slow = slow->next;
            fast = fast->next->next;
            // 快慢指针相遇,此时从head 和 相遇点,同时查找直至相遇
            if (slow == fast) {
                ListNode* index1 = fast;
                ListNode* index2 = head;
                while (index1 != index2) {
                    index1 = index1->next;
                    index2 = index2->next;
                }
                return index2; // 返回环的入口
            }
        }
        return NULL;
    }
};

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

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

相关文章

老壁灯带你入门动态规划

1. 什么是动态规划 动态规划(dynamic programming)是运筹学的一个分支&#xff0c;是求解决策过程(decision process)最优化的数学方法。 从字面意义上来理解&#xff0c;就是走一步看一步&#xff0c;边解决问题&#xff0c;边对问题进行整体规划。 其实&#xff0c;动态规…

STM32学习笔记(7_2)- ADC模数转换器代码

无人问津也好&#xff0c;技不如人也罢&#xff0c;都应静下心来&#xff0c;去做该做的事。 最近在学STM32&#xff0c;所以也开贴记录一下主要内容&#xff0c;省的过目即忘。视频教程为江科大&#xff08;改名江协科技&#xff09;&#xff0c;网站jiangxiekeji.com 本期开…

MyBatis入门01

MyBatis入门01 文章目录 MyBatis入门01前言一、搭建环境1.新建一个普通的maven项目2.删除src目录3.导入maven依赖&#xff1a;mysql驱动&#xff08;操作jdbc&#xff09;&#xff0c;juint&#xff0c;mybatis注意&#xff1a;要假如builder标签&#xff0c;预防配置文件不可导…

3.27作业

1、完成下面类 #include <iostream> #include <cstring> using namespace std;class myString { private:char *str; //记录c风格的字符串int size; //记录字符串的实际长度 public://无参构造myString():size(10){str new char[size]; …

算法(6)KMP+trie

KMP&#xff1a; 最浅显易懂的 KMP 算法讲解_哔哩哔哩_bilibili 该视频使用python书写代码&#xff0c;不会python的小伙伴也可以看看了解kmp的大致思路。 问题描述&#xff1a; kmp&#xff1a;字符串匹配算法&#xff0c;用来找一个长字符串中出现了几次小字符串&#xf…

SpringBoot整合Redis:缓存击穿--互斥锁解决

&#x1f389;&#x1f389;欢迎光临&#xff0c;终于等到你啦&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;持续更新的专栏Redis实战与进阶 本专栏讲解Redis从原理到实践 …

【旅游】泉州攻略v1.0.0

一、泉州古城 泉州市距离深圳大约520公里&#xff0c;从深圳北站出发&#xff0c;高铁大约3小时30分。 到达泉州西站后&#xff0c;往东南方向大约8公里&#xff0c;就可以到达主要的旅游景点泉州古城。 古城很适合使用一天玩耍&#xff0c;核心路线如下&#xff1a; 一路的景…

#Linux系统编程(关于解决Source Insight自动补全的问题)

&#xff08;一&#xff09;发行版&#xff1a;Ubuntu16.04.7 &#xff08;二&#xff09;记录&#xff1a; &#xff08;1&#xff09;参考博文 Source Insight 4.0 添加函数库的头文件实现函数的自动补齐 - 简书 (jianshu.com)https://www.jianshu.com/p/96595eefb988 &am…

关于内存函数的介绍

1.memcpy 2.memmove 3.memset 4.memcmp 其中&#xff0c;重点讲解memcpy 以及memmove。 1.C 库函数&#xff1a; void *memcpy(void *str1, const void *str2, size_t n) 函数作用&#xff1a;在 str2 复制 n 个字节到 str1。 其中&#xff0c;str1用于指向存储复制内容…

前端学习<二>CSS基础——04-CSS选择器:伪类

伪类&#xff08;伪类选择器&#xff09; 伪类&#xff1a;同一个标签&#xff0c;根据其不同的种状态&#xff0c;有不同的样式。这就叫做“伪类”。伪类用冒号来表示。 比如div是属于box类&#xff0c;这一点很明确&#xff0c;就是属于box类。但是a属于什么类&#xff1f;…

onnxruntime 中的 Gather 算子

上一篇文章中介绍了 Division by Invariant Integers using Multiplication 的原理&#xff0c;很多框架均才用该算法优化除法运算。onnxruntime 是已知实现中最为简洁的&#xff0c;因此本文结合 onnxruntime 的 Gather 实现进行介绍。 Gather 算子是一个索引类算子&#xff0…

unity学习(72)——编译游戏发生错误4——GAME_STATE状态

1.经过一天的冷静&#xff0c;我感觉问题出在mapHandler的update中。 如果还没有初始化对象&#xff0c;就开始读取对象的内容&#xff0c;一定会有异常的。 2.之前已有GameState结构体&#xff0c;我一直没当回事&#xff0c;这次用到了 3.从user切换到map场景的过程中会触发如…

号码采集协议讲解

仅供学习研究交流使用 需要的进去拿源码或者成品

【区块链】C语言编程实现三叉Merkle树

目录 1. Merkle树简介2. 构建Merkle树3. 生成SPV路径4. 验证SPV路径5. 三叉Merkle树创建、SPV生成及验证总程序6. 程序运行结果 1. Merkle树简介 如上图所示&#xff0c;Merkle 树的叶子节点为交易序列&#xff0c;对每一笔交易进行 Hash&#xff08;SHA 256算法&#xff09; 之…

vivado 在远程主机上启动作业、ISE命令图、实施类别,战略描述和指令映射

在远程主机上启动作业 一旦配置了远程主机&#xff0c;使用它们启动Vivado作业就很容易了。下图显示了启动运行对话框。启动跑步时&#xff0c;选择“在远程上启动跑步”hosts或Launch在群集上运行&#xff0c;然后选择特定的群集。这些作业将使用您的要执行的预配置设置。 作业…

针对COT控制模式下低ESR电容造成次谐波振荡问题的片内斜波补偿方案

COT模式&#xff1a;MOS管固定导通时间控制模式&#xff0c;关断时间由输出反馈电压与内部基准源的相较值决定。 RBCOT控制模式&#xff1a;Ripple-Based COT基于纹波的固定导通时间控制方法&#xff0c;特别的是环路控制部分主要有固定导通时间发生装置及比较器组成。RBCOT控…

DreamPolisher、InternLM2 、AniArtAvatar、PlainMamba、AniPortrait

本文首发于公众号&#xff1a;机器感知 DreamPolisher、InternLM2 、AniArtAvatar、PlainMamba、AniPortrait DreamPolisher: Towards High-Quality Text-to-3D Generation via Geometric Diffusion We present DreamPolisher, a novel Gaussian Splatting based method wit…

PPP实验

一、实验拓扑图 二、实验要求 1、R1和R2使用PPP链路直连&#xff0c;R2和R3把2条PPP链路捆绑为PPP MP直连 2、按照图示配置IP地址 3、R2对R1的PPP进行单向chap验证 4、R2和R3的PPP进行双向chap验证 三、实验步骤 1、PPP MP&#xff1a; &#xff08;1&#xff09;R2配置&#x…

C语言从入门到实战----数据在内存中的存储

1. 整数在内存中的存储 在讲解操作符的时候&#xff0c;我们就讲过了下⾯的内容&#xff1a; 整数的2进制表⽰⽅法有三种&#xff0c;即 原码、反码和补码 有符号的整数&#xff0c;三种表⽰⽅法均有符号位和数值位两部分&#xff0c;符号位都是⽤0表⽰“正”&#xff0c;⽤…

dji esdk开发(4)SDK互联互通(与云端进行小数据通信)

Edge SDK 提供接口可以通过上云 API 与和机场建立连接的云端服务器进行小数据交互,即向云端服务器发送自定义小数据与接收来自云端服务器的自定义小数据。 注意: 使用该接口发送和接收数据上下行通道最大带宽不应超过 0.5Mb/S。 1、云端低速通道介绍 使用自定义小数据通道需…