代码随想录Day4 | 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II

告别迷茫!新手如何从RTKLIB命令行程序入手,快速理解GNSS解算全流程 本文为GNSS新手提供RTKLIB命令行程序实战指南,重点介绍如何通过`rnx2rtkp`后处理解算工具快速掌握GNSS解算全流程。从环境搭建、程序编译到核心算法解析,帮助读者理解RTKLIB源码结构,并通过真实数据处理案例演示完整解算过程,是入门GNSS定位技术的实用教程。 阅读详情

代码随想录Day | 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II

两两交换链表中的节点

文档讲解:代码随想录
视频讲解: 帮你把链表细节学清楚! | LeetCode:24. 两两交换链表中的节点
状态:√

  1. 思路
    和昨天的翻转链表差不多,对于一组节点来说,我们要做的就是,
    1. 先保存第二个节点
    2. 将第一个节点指向第二个节点的后面那个节点
    3. 将第二个节点指向第一个节点
    4. 将头指针指向第二个节点
    5. 移动头指针,到下一组节点之前的那个节点上,也就是上一组反转之后的第二个节点,因为我们采用的虚拟头结点的方式
      代码如下
class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        ListNode* First = new ListNode(0,head);
        ListNode* cur = First;
        ListNode* temp;
        while(cur->next&&cur->next->next)
        {
            //记录第二个节点
            temp = cur->next->next;
            //将第一个节点的指向指向第二个节点的下一个节点
            cur->next->next = temp->next;
            //将第二个节点的指向指向第一个节点
            temp->next = cur->next;
            //将虚拟头结点的指向指向第二个节点
            cur->next = temp;
            //移动头结点到下一次调转列表之前
            cur = cur->next->next;
            temp = nullptr;
        }
        delete temp;
        return First->next;
    }
};

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

文档讲解:代码随想录
视频讲解: 链表遍历学清楚! | LeetCode:19.删除链表倒数第N个节点
状态:√

  1. 思路
    倒数第n个就是翻转链表后正数第n个,所以考虑先翻转链表,然后定义一个头结点,找到第n个之前的那个节点,将其指向改变就可以删除了。
    需要注意的是,下标从0开始,为了找到第n个节点,所以循环的判断应该是n-1。
    代码如下
	class Solution {
public:
    ListNode* reverseList(ListNode* head)
    {
        ListNode* cur = head;
        ListNode* res = nullptr;
        ListNode* temp;
        while(cur)
        {
            temp = cur->next;
            cur->next = res;
            res = cur;
            cur = temp;
        }
        delete temp;
        return res;
    }

public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* resList = reverseList(head);
        ListNode* First = new ListNode(0,resList);
        ListNode* cur = First;
        while(n-1)
        {
            cur = cur->next;
            n--;
        }
        if(cur->next)
        {
            cur->next = cur->next->next;
        }
        ListNode* resB = reverseList(First->next);
        return resB;
    }
};
  1. 双指针
    不用翻转链表,用双指针,由快指针先移动n+1步,然后两指针同时移动,当快指针指向的值为空时,慢指针刚好到达要删除的前一位。
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* First = new ListNode(0,head);
        ListNode* fast =First;
        ListNode* slow = fast;
        while(n+1)
        {
            fast = fast->next;
            n--;
        }
        while(fast)
        {
            slow = slow->next;
            fast = fast->next;
        }
        slow->next = slow->next->next;
        return First->next;
    }
};

链表相交

文档讲解:代码随想录
视频讲解:
状态:√

  1. 思路
    本题,主要就是两个链表的长度不一致,导致在移动的过程中,会错开找不到相交点,所以需要先将两个链表的长度变为一致,这里来的长度一致,是指从头结点到相交节点的长度一致。剩下的就是利用循环去寻找相等的点了。
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        int a = 0;

        int lengthA = 0;
        int lengthB = 0;
        ListNode* calA = headA;
        ListNode* calB = headB;
        while(calA)
        {
            calA = calA->next;
            lengthA++;
        }
        while(calB)
        {
            calB = calB->next;
            lengthB++;
        }
        if(lengthA>lengthB)
        {
            while(lengthA-lengthB)
            {
                headA = headA->next;
                lengthA--;
            }
        }
        else
        {
            while(lengthB-lengthA)
            {
                headB = headB->next;
                lengthB--;
            }
        }

        while(headA&&headB)
        {
            if(headA == headB)
            {
                a = 1;;
                break;
            }
            else
            {
                headA =headA->next;
                headB =headB->next;
            }
        }
        if(a)
        {
            return headA;
        }
        else
        {
            return NULL;
        }
    }
};

文档里面利用了swap将长的链表全部变为A链表,可以省去一个循环。

if(lengthA < lengthB)
{
	swap(headA,headB);
	swap(lengthA,lengthB);
}

时间复杂度: O ( m + n ) O(m+n) O(m+n)

  1. 双指针
    详细解法参考力扣的题解
    有两链表在交点之前的长度分别为a,b,相交之后的长度为c,第一次扫描链表两链表扫描指针走过的长度分别为a+c和b+c。当两链表的扫描指针到达尾端的时候,将指针的指向分别改为指向对方链表的头节点。这样扫描指针再次到达相交节点的时候,两个扫描指针走过的长度为a+c+b和b+c+a。就可以求得了。

环形链表II

文档讲解: 代码随想录
视频讲解:把环形链表讲清楚! 如何判断环形链表?如何找到环形链表的入口? LeetCode:142.环形链表II
状态: 起点的求解原理

  1. 思路
    本题分为两点
    1. 是否有环:快慢指针,快指针一次走两格,慢指针一次走一格,如果两个指针能够相遇,那么说明有环。
    2. 求起点:我们假设环的起点和链表头节点之间距离是k,环的起点到相遇点是l,相遇点到环的起点是m。
      那么有等式,在相遇的时候成立–慢指针路径的两倍等于快指针走过的路径,n表示环内循环
      2 ∗ ( k + l ) = n ( l + m ) + l + k 2*(k+l) = n(l+m)+l+k 2∗(k+l)=n(l+m)+l+k
      通过整理可以得到
      k = m + ( n − 1 ) ( l + m ) k = m+(n-1)(l+m) k=m+(n−1)(l+m)
      k表示头节点到起点的距离,m表示相遇点到起点的距离,说明如果我们从头节点和相遇点同时有指针移动,那么会在起点相遇。
  2. 为什么会寻找下面的等式:因为我们只直到头节点和相遇点的位置,所以要利用这两个位置
    最终代码如下
class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        //快慢指针,快指针2倍速,慢指针正常,若相遇则有环
        ListNode* fast = head;
        ListNode* slow = head;
        while(fast&&fast->next)
        {
            slow = slow->next;
            fast =  fast->next->next;
            if(slow == fast)
            {
                //求环的起点,从相遇点出发一个指针正常,起点出发一个指针正常
                ListNode* fastFind = slow;
                ListNode* slowFind = head;
                while(slowFind != fastFind)
                {
                    slowFind = slowFind->next;
                    fastFind = fastFind->next;
                }
                return slowFind;
                break;
            }
        }
        return NULL;

    }
};
C++怎么学?零基础也可以,一份完整学习路线图助你搞定! 提供一条清晰、系统且实践导向的C++学习路径。从基础语法、面向对象、泛型编程、异常处理,逐步深入STL、智能指针、并发编程等现代C++高级特性。无论是新手还是希望提升,通过系统学习与项目实践,助您将理论知识转化为实际解决问题的能力。 阅读详情

相关推荐

Mixer-First Receiver适用于宽带阵列应用的接收机技术1

Mixer-First Receiver适用于宽带阵列应用的接收机技术1技术的背景单元级数字化阵列传统链路到Mixer-First链路的逻辑考虑三种场景小结 技术的背景 在文章《吊打全球的顶级毫米波数字阵列项目-MIDAS》中提到了DARPA在MIDAS项目中在毫米波实现宽带单元级数字化阵列用到了一个关键的叫做N-Path filter的技术,而这个技术同样出现在了《让微波射频工程师颤抖的芯片-MATRICs》的MATRICs芯片中。 为什么DARPA的各个合作研究机构选择这种技术?这篇来自Universi

ICONO的博客 2167

代码随想录训练营 Day4打卡 链表part02 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II

代码随想录训练营 Day4打卡 链表part02 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II

qq_42952637的博客 1106

TCGA数据集介绍及数据下载指南(新手友好篇)

目录一、TCGA数据集介绍1.1 数据集介绍1.2 File介绍1.2.1 Data Category(数据类别)1.2.2 Data Type(数据类型)1.2.3 Experimental Strategy(实验策略)1.2.4 Workflow Type(工作流类型)1.2.5 Data Format(数据格式)1.2.6 Platform(平台)1.2.7 Access1.3 Cases介绍1.3.1 Case ID(案例编号)1.3.2 Primary Site(主要站点)1.3.3 Progra

Wendy的博客 6万+

代码随想录|算法训练营Day4|24. 两两交换链表中的节点,19.删除链表的倒数第N个节点,面试题 02.07. 链表相交,142.环形链表II

链表的四道核心算法题,三道中等,一道简单。

weixin_43978140的博客 1586

射频工程师必须了解的S参数四项要点

本文围绕单端 6 英寸走线的 S 参数展开深入分析,核心包含四项关键要点:低频下导线电学长度远小于信号波长,S11 呈大负分贝值、S21 接近 0 分贝;端口与走线的阻抗不匹配引发反射叠加,形成 S11 首个峰值(对应传输线四分之一波长频率);S21 相位可作为一致性检查依据,其 90° 相位差与 S11 峰值吻合;理想建模中 S11 峰值随频率上升因损耗下降,实际测量因连接器等阻抗不连续性,S11 会出现振荡上升。分析依托 Keysight ADS 工具与电磁求解器原理,为 S 参数解读提供科学支撑。

一只豌豆象的博客 1284

无需云服务器:飞牛云NAS+Docker搭建本地WordPress站点全球访问

在数字化浪潮中,网站搭建已成为个人和企业在推广自身品牌与业务的首要选择。飞牛云新推出的fnOS,这款集多功能于一身的nas系统,以其卓越的性能和灵活性,成为理想的本地网站部署平台。本文将带你一探如何在飞牛云NAS上通过Docker部署WordPress,并利用cpolar实现全球访问。

LT15171009269的博客 6528

代码随想录Java算法训练营Day4 | LeetCode 24.两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II

学习时长:3h。

m0_50851715的博客 1766

汽车级智能栅极驱动器深度解析 | 连载01:DRV871x-Q1系列产品架构与核心特性

集成度:单芯片集成多通道驱动器、电源管理、电流检测智能化:自适应控制算法,减少外部元件可靠性:多重保护机制,满足汽车级要求灵活性:SPI和硬件两种接口,适应不同应用需求。

VehSwHwDeveloper的博客 1153

代码随想录【day 4 链表】| 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II

代码随想录【day 4 链表】| 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II

weixin_43891814的博客 2709

【计算机科学导论实验】加法图灵机模拟 题解

本文提供计算机科学导论课程“图灵机加法器”实验的个人思路,仅供参考。

Chavapa's blog 2578

snmp MIB详解

每个 MIB 对象都由一个对象标识符(OID)和对象类型组成。OID 是一个由多个数字组成的路径(类似于 IP 地址),它标识了 MIB 中对象的层次结构。

dlz0836的博客 3721

Studying-代码随想录训练营day4| 24.两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题02.07.链表相交、142.环形链表II

力扣:24.两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题02.07.链表相交、142.环形链表II

yachihaoteng的博客 1311

Supreme小程序自动化抢购终端——源码架构与执行流程全解析

本系统是一套基于开发的桌面端小程序自动化抢购终端。把只有开发者能跑的脚本,包装成普通用户也能操作的桌面工具。参数自动捕获 → 商品多关键词检索 → sku/尺码/库存映射 → 多商品任务队列 → 定时/立即抢购 → 订单创建 → 支付参数拉取 → 本地服务生成支付链接 → 手机微信扫码付款这套 Supreme 抢购终端,表面上看是一个"下单工具"。但从工程角度审视,它已经具备了一个小型桌面自动化系统GUI 层:CustomTkinter 现代化界面,线程安全业务层:多商品队列、定时调度、任务编排。

猫敷雪 203

【代码随想录】Day4 链表part02 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II

链表的第二部分今天主要加深了链表的理解以及环形链表,虽然以前做过,但是不熟练,今天收获很多。DAY Finished 撒花~

SuperMao2016的博客 894

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

代码随想录算法训练营Day4 | 24两两交换链表中的节点、19删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II

链表:两两交换、删除指定节点、链表相交、环状链表

宁愿过拟合不要欠拟合 1113

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

代码随想录DAY4 24. 两两交换链表中的节点19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II

语言为python 题目中所有的参考资料都来自于代码随想录大家可以自行查看24. 两两交换链表中的节点题目解析:题目要求需要交换相邻链表节点 只能进行节点交换 然后返回头节点 不得修改节点内部的值。

qq_39508891的博客 1491

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

代码随想录 Day 4 | 24.两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II 、【链表】总结

一般涉及到 增删改操作,用虚拟头结点都会方便很多, 如果只能查的话,用不用虚拟头结点都差不多。当然也可以为了方便记忆,统一都用虚拟头结点。代码随想录。

loveJava17的博客 1092

代码随想录 Day4 | Leetcode24 两两交换链表中的节点、Leetcode19 删除链表的倒数第N个节点、面试题 02.07 链表相交、Leetcode142 环形链表II

同是碳基生物,怎么差别这么大。。。。

qq_41502639的博客 1245

【代码随想录训练营第42期 Day4打卡 LeetCode 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题02.07. 链表相交 142.环形链表II】

递归,双指针,哈希在链表中的应用

记得要努力变强 1576

代码随想录算法训练营Day4(LeetCode24 两两交换链表中的节点;LeetCode19 删除链表的倒数第N个节点;面试题02.07 链表相交;LeetCode142 环形链表II)

反而使得我对指针为空的判断变得更加复杂了,看了代码随想录发现只需要一个。这道题需要使用双节点,遍历一遍就可以了。我在做的时候,第一次返回了。这道题不难但是还是看了题解思路才写出来的,而且有一些冗余变量。这道题直接写出来了,但是一开始用了很多指针,用于表达。这道题看了题解,关键在于要理解第一次相遇时,,但是这个节点可能被删除了,因此需要返回。的交换来减少,这里的细节还需要注意。变量,这样反而将为空判断全部放到。

weixin_51001256的博客 1284

代码随想录算法训练营DAY4 | 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II

可以使用快慢指针法,分别定义 fast 和 slow 指针,从头结点出发,fast指针每次移动两个节点,slow指针每次移动一个节点,如果 fast 和 slow指针在途中相遇 ,说明这个链表有环。其实这种情况和n为1的时候 效果是一样的,一样可以通过这个方法找到 环形的入口节点,只不过,index1 指针在环里 多转了(n-1)圈,然后再遇到index2,相遇点依然是环形的入口节点。,n为fast指针在环内走了n圈才遇到slow指针, (y+z)为 一圈内节点的个数A。当 n为1的时候,公式就化解为。

muye214的博客 1397

[代码随想录Day4打卡] 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II 总结

代码随想录打卡第4天,希望坚持。这一篇关于链表最后一部分。

goodenough5的博客 1002

代码随想录Day4| LeetCode 24 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II

一定是快指针先进入这个环,然后慢指针才进入这个环,快在追慢的过程,快指针是以什么速度接近慢指针呢。相对于慢指针快指针的速度是每次移一个节点的移动速度。所以他两一定会相遇。此时我们就可以比较curA和curB是否相同,如果不相同,同时向后移动curA和curB,如果遇到curA == curB,则找到交点。给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。为了方便举例,假设节点元素数值相等,则节点指针相等。从起始位置到入口处x,相遇到入口y,y到出口是z。

luyimin87的博客 1006

代码随想录刷题day4丨24. 两两交换链表中的节点,19.删除链表的倒数第N个节点 ,面试题 02.07. 链表相交 ,142.环形链表II ,链表总结

链表的一大问题就是操作当前节点必须要找前一个节点才能操作。这就造成了,头结点的尴尬,因为头结点没有前一个节点了。每次对应头结点的情况都要单独处理,所以使用虚拟头结点的技巧,就可以解决这个问题。反转链表是面试中高频题目考察链表的操作其实就是考察指针的操作,是面试中的常见类型。

m0_75195038的博客 871

代码随想录Day4 | 24. 两两交换链表中的节点,19. 删除链表的倒数第N个节点,面试题 02.07. 链表相交,142. 环形链表II

【链表】24. 两两交换链表中的节点,19. 删除链表的倒数第N个节点,面试题 02.07. 链表相交,142. 环形链表II

weixin_43913958的博客 822

代码随想录day4|24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交 、142.环形链表II、总结

代码随想day4

xccxynb的博客 989
上一篇: 代码随想录Day3| 203.移除链表元素707.设计链表206.反转链表
下一篇: 代码随想录Day6 | 哈希表理论基础 242.有效的字母异位词349. 两个数组的交集 202. 快乐数1. 两数之和
sRiddle
博客等级 码龄7年 528粉丝 63原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值