代码随想录-算法训练营day04【链表02:两两交换链表中的节点、删除链表的倒数第N个节点、链表相交、环形链表II】

news2025/6/18 17:45:15

代码随想录-035期-算法训练营【博客笔记汇总表】-CSDN博客

第二章 链表part02

● day 1 任务以及具体安排:https://docs.qq.com/doc/DUG9UR2ZUc3BjRUdY 
● day 2 任务以及具体安排:https://docs.qq.com/doc/DUGRwWXNOVEpyaVpG 
● day 3 任务以及具体安排:https://docs.qq.com/doc/DUGdqYWNYeGhlaVR6
 
今日任务 

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

 详细布置 

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

用虚拟头结点,这样会方便很多。 

本题链表操作就比较复杂了,建议大家先看视频,视频里我讲解了注意事项,为什么需要temp保存临时节点。

题目链接/文章讲解/视频讲解: https://programmercarl.com/0024.%E4%B8%A4%E4%B8%A4%E4%BA%A4%E6%8D%A2%E9%93%BE%E8%A1%A8%E4%B8%AD%E7%9A%84%E8%8A%82%E7%82%B9.html

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

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

题目链接/文章讲解/视频讲解:https://programmercarl.com/0019.%E5%88%A0%E9%99%A4%E9%93%BE%E8%A1%A8%E7%9A%84%E5%80%92%E6%95%B0%E7%AC%ACN%E4%B8%AA%E8%8A%82%E7%82%B9.html

 面试题 02.07. 链表相交  

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

题目链接/文章讲解:https://programmercarl.com/%E9%9D%A2%E8%AF%95%E9%A2%9802.07.%E9%93%BE%E8%A1%A8%E7%9B%B8%E4%BA%A4.html

 142.环形链表II  

算是链表比较有难度的题目,需要多花点时间理解 确定环和找环入口,建议先看视频。

题目链接/文章讲解/视频讲解:https://programmercarl.com/0142.%E7%8E%AF%E5%BD%A2%E9%93%BE%E8%A1%A8II.html

目录

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

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

面试题 02.07. 链表相交

142.环形链表II


0024_两两交换链表中的节点

class Solution0024 {
    public ListNode swapPairs(ListNode head) {//递归版本
        if (head == null || head.next == null) return head;//base case,退出提交

        ListNode next = head.next;//获取当前节点的下一个节点【node2】

        ListNode newNode = swapPairs(next.next);//进行递归【node3】

        //这里进行交换
        next.next = head;//【node2】指向【node1】
        head.next = newNode;//【node1】与【node2】进行交换,交换后,【node1】指向【node3】
        return next;
    }

    public ListNode swapPairs2(ListNode head) {
        ListNode dumyhead = new ListNode(-1); // 设置一个虚拟头结点
        dumyhead.next = head; // 将虚拟头结点指向head,这样方便后面做删除操作
        ListNode cur = dumyhead;
        ListNode temp; // 临时节点,保存两个节点后面的节点
        ListNode firstnode;  // 临时节点,保存两个节点之中的第一个节点
        ListNode secondnode; // 临时节点,保存两个节点之中的第二个节点
        while (cur.next != null && cur.next.next != null) {
            temp = cur.next.next.next;
            firstnode = cur.next;
            secondnode = cur.next.next;
            cur.next = secondnode;       // 步骤一
            secondnode.next = firstnode; // 步骤二
            firstnode.next = temp;       // 步骤三
            cur = firstnode; // cur移动,准备下一轮交换
        }
        return dumyhead.next;
    }
}

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

双指针的经典应用,如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾,删掉slow所指向的节点就可以了。

class Solution0019 {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode dummyNode = new ListNode(0);
        dummyNode.next = head;

        ListNode fastIndex = dummyNode;
        ListNode slowIndex = dummyNode;

        //只要快慢指针相差 n 个结点即可
        for (int i = 0; i <= n; i++) {
            fastIndex = fastIndex.next;
        }

        //让fast和slow同时移动,直到fast指向链表末尾
        while (fastIndex != null) {
            fastIndex = fastIndex.next;
            slowIndex = slowIndex.next;
        }

        //此时 slowIndex 的位置就是待删除元素的前一个位置。
        //具体情况可自己画一个链表长度为 3 的图来模拟代码来理解
        slowIndex.next = slowIndex.next.next;
        return dummyNode.next;
    }
}

面试题 02.07. 链表相交

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        if (headA == null || headB == null) {
            return null;
        }
        int lenA = 0, lenB = 0;
        ListNode curA = headA, curB = headB;
        while (curA != null) {
            lenA++;
            curA = curA.next;
        }
        while (curB != null) {
            lenB++;
            curB = curB.next;
        }
        if (lenA > lenB) {
            int len = lenA - lenB;
            while (len > 0) {
                headA = headA.next;
                len--;
            }
        } else if (lenB > lenA) {
            int len = lenB - lenA;
            while (len > 0) {
                headB = headB.next;
                len--;
            }
        }
        while (headA != null) {
            if (headA == headB) {//这个地方不能写:headA.val == headB.val
                return headA;
            }
            headA = headA.next;
            headB = headB.next;
        }
        return null;
    }

    public ListNode getIntersectionNode2(ListNode headA, ListNode headB) {
        ListNode curA = headA;
        ListNode curB = headB;
        int lenA = 0, lenB = 0;
        while (curA != null) {//求链表A的长度
            lenA++;
            curA = curA.next;
        }
        while (curB != null) {//求链表B的长度
            lenB++;
            curB = curB.next;
        }
        curA = headA;
        curB = headB;
        //让curA为最长链表的头,lenA为其长度
        if (lenB > lenA) {
            //1.swap (lenA, lenB);
            int tmpLen = lenA;
            lenA = lenB;
            lenB = tmpLen;
            //2.swap (curA, curB);
            ListNode tmpNode = curA;
            curA = curB;
            curB = tmpNode;
        }
        //求长度差
        int gap = lenA - lenB;
        //让curA和curB在同一起点上(末尾位置对齐)
        while (gap-- > 0) {
            curA = curA.next;
        }
        //遍历curA和curB,遇到相同则直接返回
        while (curA != null) {
            if (curA == curB) {
                return curA;
            }
            curA = curA.next;
            curB = curB.next;
        }
        return null;
    }
}

0142_环形链表II

class Solution0142 {
    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) {// 有环
                ListNode index1 = fast;
                ListNode index2 = head;
                // 两个指针,从头结点和相遇结点,各走一步,直到相遇,相遇点即为环入口
                while (index1 != index2) {
                    index1 = index1.next;
                    index2 = index2.next;
                }
                return index1;
            }
        }
        return null;
    }
}

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

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

相关文章

华为2024年校招实习硬件-结构工程师机试题(四套)

华为2024年校招&实习硬件-结构工程师机试题&#xff08;四套&#xff09; &#xff08;共四套&#xff09;获取&#xff08;WX: didadidadidida313&#xff0c;加我备注&#xff1a;CSDN 华为硬件结构题目&#xff0c;谢绝白嫖哈&#xff09; 结构设计工程师&#xff0c;结…

1. VirtualBox安装CentOS

安装 VirtualBox 地址:https://www.virtualbox.org/wiki/Downloads 版本: 6.1和7.0+版本都可以 安装: windows上安装需要admin权限,右键菜单选中 “Run as administrator” 安装 CentOS 6.10 地址:https://vault.centos.org/6.10/isos/x86_64/ 版本: 如果不需要GUI,选择…

竹云董事长在第十二届中国电子信息博览会开幕峰会暨全国“专精特新”电子信息行业论坛作主题演讲

2024年4月9日&#xff0c;第十二届中国电子信息博览会开幕峰会&#xff08;CITE2024&#xff09;暨全国“专精特新”电子信息行业论坛在深圳会展中心盛大举行。 本届电博会开幕峰会以“追求卓越&#xff0c;数创未来”为主题&#xff0c;特邀百位专家学者、行业精英、知名投资人…

金三银四面试题(十九):MySQL中的锁

在MySQL中&#xff0c;锁是非常重要的&#xff0c;特别是在多用户并发访问数据库的环境中&#xff0c;因此也是面试中常问的话题。 请说说数据库的锁&#xff1f; 关于MySQL 的锁机制&#xff0c;可能会问很多问题&#xff0c;不过这也得看面试官在这方面的知识储备。 MySQL …

新版HI3559AV100开发注意事项(三)

新版HI3559AV100开发注意事项&#xff08;三&#xff09; 十九、用的sdk是Hi3559V200_MobileCam_SDK_V1.0.1.5 播放AAC音频文件&#xff0c;adec->ao;adec的初始化里面包括了aaclc解码器的注册&#xff0c;可是在HI_MPI_ADEC_RegisterDecoder(&s32Handle, &stAac);…

43-技术演进(上):虚拟化技术演进之路

在Kubernetes集群中部署IAM应用&#xff0c;会涉及到一些重要的云原生技术&#xff0c;例如Docker、Kubernetes、微服务等。另外&#xff0c;云原生架构中还包含了很多其他的技术 因为这一讲涉及的技术栈很多&#xff0c;所以我会把重点放在演进过程上&#xff0c;不会详细介…

面试算法-171-翻转二叉树

题目 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1] 解 class Solution {public TreeNode invertTree(TreeNode root) {if (root n…

企业常用命令(touch/别名/重定向/Linux字符)7368字详谈

企业高薪思维&#xff1a; 企业&#xff08;工作/学习中&#xff09;操作前备份&#xff0c;操作后检查 最小化原则 1.安装软件最小化 2.参数选项最小化 3.登录用户权限最小化&#xff08;不用root登录&#xff09; 要想成功/学习上/工作上 永远比别人多做一点点&#xff08;别…

冯喜运:4.11黄金今日还会下跌吗?黄金原油最新行情分析

【 黄金行情趋势分析】&#xff1a;周三(4月10日)&#xff0c;强于预期的CPI通胀数据削弱对美国提前降息的预期&#xff0c;美元和国债收益率走强&#xff0c;现货黄金大跌近20美元。周四(4月11日)亚市早盘&#xff0c;金价交投在2335美元/盎司附近。周三&#xff0c;在美国通胀…

使用 EFCore 和 PostgreSQL 实现向量存储及检索

随着 ChatGPT 的兴起及其背后的 AIGC 产业不断升温,向量数据库已成为备受业界瞩目的领域。FAISS、Milvus、Pinecone、Chroma、Qdrant 等产品层出不穷。市场调研公司 MarketsandMarkets 的数据显示,全球向量数据库市场规模预计将从 2020 年的 3.2 亿美元增长至 2025 年的 10.5…

微服务项目sc2024父工程

1.基础版本要求 jdk 17maven 3.9mysql 8.0spring boot 3.2.0spring cloud 2023.0.0spring cloud alibaba 2022.0.0.0-RC2 2.创建父工程 2.1.字符编码 2.2.java编译版本 2.3.注解生效激活 2.4.File Type过滤 2.5.父工程中只保留pom文件,其余的删了 3.父工程pom文件 <?xm…

一辆汽车的节拍时间是怎样的?

节拍时间&#xff0c;又称 takt time&#xff0c;是德语中“节奏”的意思。在汽车制造业中&#xff0c;它指的是按照客户需求和生产计划&#xff0c;生产一辆汽车所需的时间。这个时间是固定的&#xff0c;它决定了生产线上每个工序的操作速度和节奏&#xff0c;是生产线上所有…

Vue中SourceMap的使用方法详解

目录 一、概述 二、使用方法 三、生成SourceMap 四、优化 五、结语 一、概述 Vue.js是一套构建用户界面的渐进式框架&#xff0c;通过HTML模板或者直接写render函数可以快速开发单页应用。在开发过程中&#xff0c;很多时候我们需要调试代码&#xff0c;追踪错误。Vue官方…

一键排除烦恼!苹果手机怎么恢复出厂设置

当你的苹果手机遇到了一系列问题&#xff0c;或者你打算将手机出售或转让给他人时&#xff0c;恢复出厂设置是一种常见的解决方案。这一过程可以将手机恢复到刚购买时的状态&#xff0c;清除所有个人数据和设置&#xff0c;以确保隐私安全和设备的顺畅运行。 苹果手机的恢复出…

计算机网络-OSPF的其它特性

一、路由器对LSA的处理原则 运行链路状态路由协议的路由器之间首先会建立一个协议的邻居关系&#xff0c;然后彼此之间开始交互LSA&#xff08;Link State Advertisement&#xff0c;链路状态通告&#xff09;。LSA是OSPF进行路由计算的关键依据。链路状态类型、链路状态ID、通…

MySQL - 深入MySQL索引的秘密(一)

1. 如果没有任何索引,数据库是如何根据查询语句搜索数据的? 在磁盘文件中,数据页之间是组成双向链表的,然后数据页内部的数据行是组成单向链表的,而且数据行是根据主键从小到大排序的。然后每个数据页里都会有一个页目录,里面根据数据行的主键存放了一个目录,同时数据行…

LLM 推理优化探微 (4) :模型性能瓶颈分类及优化策略

编者按&#xff1a; 在人工智能浪潮袭卷全球的大背景下&#xff0c;进一步提升人工智能模型性能&#xff0c;满足更多应用需求已经刻不容缓。如何优化模型延迟和吞吐量&#xff0c;成为了业界亟待解决的重要问题。 我们今天为大家带来的这篇文章&#xff0c;其观点为&#xff1…

uniapp 小程序获取WiFi列表

<template><view ><button click"getWifiList">获取WiFi列表</button><scroll-view:scroll-top"scrollTop"scroll-yclass"content-pop"><viewclass"itemInfo"v-for"(item, index) in wifiList&…

【C 数据结构】循环链表

文章目录 【 1. 基本原理 】【 2. 循环链表的创建 】2.1 循环链表结点设计2.2 循环单链表初始化 【 3. 循环链表的 插入 】【 4. 循环单链表的 删除操作 】【 5. 循环单链表的遍历 】【 6. 实例 - 循环链表的 增删查改 】【 7. 双向循环链表 】 【 1. 基本原理 】 对于单链表以…

C语言数组:数据的集合艺术

在C语言的世界里&#xff0c;数组就像是一个魔术盒&#xff0c;里面装满了相同类型的宝藏。今天&#xff0c;就让我们一起揭开这个魔术盒的神秘面纱&#xff0c;探索数组的魅力所在。 一、数组的定义与初始化 数组&#xff0c;简单来说&#xff0c;就是一系列相同类型数据的…