【代码随想录】刷题Day4

news2024/11/25 4:40:11

1.交换链表

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

前后指针实现

1.没有元素或者只有一个元素无意义

2.给出一个前驱prev,以及用来交换的两个节点cur和next

3.我当时是这么想的,如果两个指针一起动,那么就要用cur和next同时判断结束,也许这个条件会比较苛刻(我就烦这种边界条件),所以我觉得动一个指针来判断条件就可以了

4.所以我选择用cur判断,在循环中确定next的指向;prev和cur的更新

5.判断条件就变成了cur是否为空,cur的next是否为空

6.循环进去说明需要交换,所以确定next的指向是cur的next;确定是否更新的是根节点;交换;更新prev,cur进入下一轮

class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        if(head==nullptr||head->next==nullptr)
            return head;
        ListNode* prev = nullptr;
        ListNode* cur = head;
        ListNode* next = head;
        while(cur&&cur->next)
        {
            next=cur->next;
            if(prev==nullptr)
                head=next;
            else
                prev->next=next;
            cur->next=next->next;
            next->next=cur;
            prev=cur;
            cur=cur->next;
        }
        return head;
    }
};

前驱?前驱!触发被动了一样的字眼,我是不是可以用递归做啊🤔

 递归交换

1.首先没有元素或者只有一个元素无意义,过

2.递归函数,确定参数头节点要传,因为会换;前驱next、cur和后继next

3.我们依然可以用一个节点进行判断是否到链表底部,cur是否空或者cur的next为空 -- 对应的就是链表是双数还是单数

4.往下传递归的参数其实只需要更新cur和prev,因为前驱必须确定下来,不然往下找不到了,cur也必须有因为我们的底部条件是靠cur判断的,prev等于现在的cur->next,cur等于cur->next->next,就是都得跨两个节点

5.执行交换的代码,next自然就是cur->next。先看是否需要更新的是头节点其条件是prev是否为nullptr;随后交换,返回即可

class Solution {
public:
    void _swapR(ListNode*& head,ListNode* prev,ListNode* cur,ListNode* next)
    {
        if(cur==nullptr||cur->next==nullptr)
            return;
        _swapR(head,cur->next,cur->next->next,next);
        next=cur->next;
        if(prev==nullptr)
            head=next;
        else
            prev->next=next;
        cur->next=next->next;
        next->next=cur;
        return;
    }

    ListNode* swapPairs(ListNode* head) {
        if(head==nullptr||head->next==nullptr)
            return head;
        _swapR(head,nullptr,head,head);
        return head;
    }
};

2. 快慢指针

我觉得代码实现很简单,主要是思想

想要找从后往前的数,就应该用快慢指针,先让快的指针走n次,然后快慢指针一起动,快指针到边界,慢指针的下一个就是我们要删除的节点。

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* slow = head;
        ListNode* fast = head;
        for(int i=0;i<n;i++)
            fast=fast->next;
        if(fast==nullptr)
        {
            ListNode* tmp = slow;
            head = slow->next;
            delete tmp;
            return head;
        }
        while(fast->next)
        {
            slow=slow->next;
            fast=fast->next;
        }
        ListNode* tmp = slow->next;
        slow->next=tmp->next;
        delete tmp;
        return head;
    }
};

3.链表相交

面试题 02.07. 链表相交

因为只想时间复杂度为O(N),空间复杂度为O(1)

所以我想的是给他们的长度算出来,做差值,然后长的那个往后走差值个数,这样两个链表同样一个长度往下走,那么只要知道什么时候两个节点地址一样,就返回

class Solution {
public:
    int getListNum(ListNode* root)
    {
        int num = 0;
        while(root)
        {
            root=root->next;
            num++;
        }
        return num;
    }

    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        int NA = getListNum(headA);
        int NB = getListNum(headB);
        int gap = abs(NA-NB);
        ListNode* more = headA;
        ListNode* less = headB;
        if(NA<NB)
        {
            less = headA;
            more = headB;
        }
        for(int i=0;i<gap;i++)
        {
            more=more->next;
        }
        while(less!=nullptr&&more!=nullptr&&more!=less)
        {
            more=more->next;
            less=less->next;
        }
        return more;
    }
};

4.环形链表

142. 环形链表 II

哈希表 嘻哈表

讲个笑话,程序员在课本上学到了数据冲突可以用哈希表解决;到面试时,面试官问这个求职的程序员:“当程序员和项目经理发生冲突时要怎么解决”,“使用哈希表”程序员想都没想脱口而出。

使用哈希表可以直观的看到数据是否之前插入过,使用起来很简单,不过哈希表通过红黑树实现的这个背后逻辑才是关键,这里不说明了

class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        set<ListNode*> s;
        ListNode* cur = head;
        while(cur)
        {
            if(s.find(cur)!=s.end())
                return cur;
            s.insert(cur);
            cur=cur->next;
        }
        return nullptr;
    }
};

快慢指针

操场上一个跑得快一个跑得慢,最终快的一定会把慢的套圈。这个题目的思路也是一样的

1.定义快慢指针,快指针走两个节点,慢指针走一个节点;其实可以如果真的有环,慢指针不动,快指针以一个节点为单位靠近慢指针

2.只要两个地址碰到一起,那确实是有环,不过题目要我们返回头一个链接上的节点,所以我们需要通过一个数学思想来解决

 最后得到x = (n - 1) (y + z) + z,说明x跟z长度一样

那么从fast和从头节点同时走,会遇到一样的节点

class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        ListNode* cur = head;
        ListNode* fast = head;
        int fastnum = 0;
        ListNode* slow = head;
        int slownum = 0;
        while(fast&&fast->next&&fast->next->next)
        {
            fast=fast->next->next;
            fastnum+=2;
            slow=slow->next;
            slownum++;
            if(slow==fast)
            {
                while(cur!=fast)
                {
                    cur=cur->next;
                    fast=fast->next;
                }
                return cur;
            }
        }
        return nullptr;
    }
};

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

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

相关文章

C#基础学习--异常

目录 什么是异常 try语句 异常类 catch子句 catch子句段 finally块 为异常寻找处理程序 更进一步搜索 一般法则 抛出异常 不带异常对象的抛出 什么是异常 异常是程序运行时错误&#xff0c;它违反了系统约束或应用程序约束&#xff0c;或出现了在正常操作时未预料的情…

Windows环境下JDK内置迭代器的简介

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天讨论一下Windows环境下JDK内置迭代器。 相信大家已经注意到&#xff0c;为了让广大程序员能够更加方便地操作聚合对象&#xff0c;在Java、C#等编程语言中都提供了内置迭代器。 如果对这种迭代器还不了…

在JetsonNano上安装PREEMPT-RT实时核+IghEtherCAT主站的详细步骤

特别说明&#xff1a;由于本人空闲时间有限&#xff0c;此博客中所有内容均是从本人的个人笔记中摘抄出来&#xff0c;命令行大多以图片形式展示&#xff0c;不能提供复制粘贴功能敬请体谅。此外&#xff0c;第一部分关于在 Jetson Nano 上安装PREEMPT-RT 实时核的步骤比较详细…

企业工商四要素核验 API:有效应对商业欺诈和恶意交易的利器

引言 企业工商四要素核验是一种用于验证企业基本信息的方法&#xff0c;主要包括企业名称、社会统一信用代码、法人名称、法人身份证四个要素。这些要素是企业注册时必须提供的信息&#xff0c;通过对这些信息的验证&#xff0c;可以确定企业的真实性和合法性&#xff0c;通常…

【力扣-21】合并两个有序链表

&#x1f58a;作者 : Djx_hmbb &#x1f4d8;专栏 : 数据结构 &#x1f606;今日分享 : 英文文章里 : TL;DR 或者 tl;dr。 网上英文解释有两种&#xff0c;一种是Too long;Don’t read&#xff0c;另一种是Too long;Didn’t read。意思是&#xff1a;“文章太长了&#xff0c;读…

Stable Diffusion MacBookAir 手把手安装教程,以及checkpoint安装、Lora安装、civitai介绍。

目标&#xff1a; 本地部署Stable Diffusion 安装步骤&#xff1a; 安装git Git - Downloadshttps://git-scm.com/downloads安装python 3.10.6 Python Releases for macOS | Python.orgThe official home of the Python Programming Languagehttps://www.python.org/downl…

再捐1亿元种树治沙:蚂蚁集团持续七年支持内蒙古生态治理

今天&#xff08;4月22日&#xff09;是“世界地球日”&#xff0c;内蒙古自治区林草局与蚂蚁集团启动战略合作&#xff1a;由蚂蚁集团在三年内再捐资1亿元&#xff0c;通过公益项目“蚂蚁森林”支持浑善达克沙地的生态治理。这1亿元将用于当地林草生态的修复保护、沙化土地的治…

助力电力行业数字化,BI 大有可为

各地密集上马的电力工程为上下游产业链发展带去了更多市场机遇&#xff0c;“三零”“三省”办电服务的推广让企业获得了看得见、摸得着的实惠&#xff0c;电力行业正在以自身高质量发展新成效助力经济稳增长&#xff0c;为扎实推进中国式现代化建设注入强劲动能。 电力行业是…

Spring Cloud Gateway Actuator API SpEL表达式注入命令执行(CVE-2022-22947)

Spring Cloud Gateway Actuator API SpEL表达式注入命令执行&#xff08;CVE-2022-22947&#xff09; 0x00 前言 Spring Cloud Gateway是Spring中的一个API网关。其3.1.0及3.0.6版本&#xff08;包含&#xff09;以前存在一处SpEL表达式注入漏洞&#xff0c;当攻击者可以访问…

plt.title()函数中文无法显示问题

文章目录 问题描述解决办法plt.title()函数参数说明 问题描述 由于画图时plt.title()默认是显示英文&#xff0c;如果我们设置标题为中文&#xff0c;会无法显示&#xff0c;如图&#xff1a; plt.title(训练损失) plt.plot(np.arange(len(losses)), losses, -o, colorred) p…

快速学会 IDEA 中 Git 的使用与 GitHub 仓库创建、连接、发布

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; 目录 一、Git &#x1f334;1.Git 工作流程2.Git 安装3.常用命令4.分支 二、远程仓库 GitHub &#x1f335;1.注册使用2.配置 SSH 公钥3.在 IDEA 中配置3.IDEA to GitHub4.创建分支5.commit 到仓库6.从远程仓库中抓…

【数据结构与算法】无队头指针的队列置空队、判队空 、入队和出队算法

题目 Qestion&#xff1a; 假设以带头结点的循环链表表示队列&#xff0c;并且只设一个指针指向队尾元素结点 (注意不设头指针) &#xff0c;试编写相应的置空队、判队空、入队和出队等算法。 核心思路 该队列的特殊之处&#xff1a; 用链表来表示队列该链表为带头节点的链表该…

VM ware workstation安装mac虚拟机

一. 工具准备 VMware workstation mac os的镜像文件&#xff08;链接&#xff1a;https://pan.baidu.com/s/1AdDGFU186bqKvW4wuGtpqw &#xff0c;提取码&#xff1a;tdvc&#xff09; 下载一个auto-unlocker文件&#xff08;https://github.com/paolo-projects/auto-unlocke…

人工智能十大流行算法,通俗易懂讲明白

人工智能是什么&#xff1f;很多人都知道&#xff0c;但大多又都说不清楚。 事实上&#xff0c;人工智能已经存在于我们生活中很久了。 比如我们常常用到的邮箱&#xff0c;其中垃圾邮件过滤就是依靠人工智能&#xff1b;比如每个智能手机都配备的指纹识别或人脸识别&#x…

「QT」QT中new的对象不需要delete的原因

博客主页:何曾参静谧的博客 文章专栏:「QT」QT5快速学习 目录 说明注意事项说明 在QT中,一般来说,通过new关键字创建的对象由QT的对象树来管理,而通过其他方式创建的对象就需要手动释放。QT的对象树可以看做是QT提供的一种内存管理机制,它能够自动地管理和释放对象的内存…

Xilinx之7系列时钟规划失败解析

目录 一 、前言 二、时钟规划 ​2.1 时钟单元经过非时钟路径 2.2 资源不足 2.3 跨半区 一 、前言 在设计的工程中&#xff0c;经常会在implementation的布局或布线阶段失败&#xff0c;下面将针对xilinx 7系列时钟规划失败的场景进行分类描述。本文示例器件为xc7k480tffv1…

华为笔记本怎么录屏?分享2个实用方法

案例&#xff1a;如何对华为笔记本电脑进行屏幕录制&#xff1f; 【今天刚刚了解到电脑可以录屏&#xff0c;但是我拿着我的华为电脑找了半天&#xff0c;也找不到它的屏幕录制功能在哪。华为电脑录屏功能在哪&#xff1f;华为笔记本怎么录屏&#xff1f;有没有大神可以教教我…

DNS缓存失效,nginx死循环访问造成连接数瞬间飚高的问题

0.背景介绍 某服务domain.com.cn 之前DNS解析到服务真实地址10.1.1.11&#xff0c;后面需要对用户登录增加黑名单功能&#xff0c;于是在openresty针对服务domain.com.cn的特性完成了黑名单功能。黑名单功能已经上线几个月&#xff0c;但是DNS从服务真实地址10.1.1.11切换到ope…

Spring MVC 参数解析(13)

目录 简介 调用流程 1. 首先&#xff0c;还是需要进行到前端控制器的doDispatch方法&#xff0c;这是我们的调用Spring MVC的核心入口方法 2. 在doDispatch方法内部&#xff0c;我们调用到了HandlerAdapter.handle(*****) 方法 3. 最终&#xff0c;我们会来到 RequestMappi…

完美解决丨2. `TypeError: list indices must be integers or slices, not str`

‘tuple’ object does not support item assignment 原因&#xff1a; tuple 是一个元素不可变的列表&#xff0c;如果尝试对 tuple 中的某个元素进行修改&#xff0c;会报错。 解决办法&#xff1a; 需要将 tuple 转换为 list&#xff0c;然后再把 list 转换为 tuple。 示例…