leetcode刷题详解二

news2024/10/5 14:31:57
160. 相交链表

本质上是走过自己的路,再走过对方的路,这是求两个链表相交的方法

 ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        //本质上是走过自己的路,再走过对方的路
        if(headA == NULL|| headB == NULL){
            return NULL;
        }
        ListNode* temp_a = headA;
        ListNode* temp_b = headB;
        while(temp_a!=temp_b){
            if(temp_a == NULL){
                temp_a = headB;
            }else{
                temp_a = temp_a->next;
            }
            if(temp_b == NULL){
                temp_b = headA;
            }else{
                temp_b = temp_b->next;
            }
        }
        return temp_a;
    }

双指针法

情况一:两个链表相交。这个好判断

情况二:两个链表不相交。由于两个链表没有公共节点,两个指针也不会同时到达两个链表的尾节点,因此两个指针都会遍历完两个链表,指针pA 移动了m+n 次、指针pB 移动了 n+m 次之后,两个指针会同时变成空值null,此时返回null,满足循环条件。

⭕️206. 反转链表
ListNode* reverseList(ListNode* head) {
        if(head == nullptr){
            return head;
        }
        if(head->next == nullptr){
            return head;
        }
        ListNode *temp = reverseList(head->next);
        head->next->next = head;
        head->next = nullptr;
        return temp;
    }

上面这段代码是反转列表标准递归代码,也很好理解

21. 合并两个有序链表

使用迭代好理解。这道题第一反应就是四种种情况,全是空,一个是空,全不为空。

正常理解就是if,else if什么的,但是这样在写全不为空的时候很麻烦。

下面代码一个while(l1 && l2)就解决了上面的问题,很巧妙,很值得记住。必须全不为空才能进入循环,有一个是空指针就不能进入,这样代码好写很多很多

ListNode *head = new ListNode(-1);
        ListNode *pre = head;
        while(l1 && l2){
            ListNode* temp1 = l1;
            ListNode* temp2 = l2;
            if(l1->val >= l2->val){
                pre->next = l2;
                l2 = l2->next;
            }else{
               pre->next =l1;
               l1 = l1->next;
            }
            pre = pre->next;
        }
        if(l1 == nullptr){
            pre->next = l2;
        }
        if(l2 ==nullptr){
            pre->next = l1;
        }
        return head->next;
    }
141. 环形链表

思路:用快慢指针,如果是环形链表会相交

主要点在于while的循环条件,一定要针对快指针进行条件判断同时用&&而不是||

bool hasCycle(ListNode *head) {
        ListNode* fast = head;
        ListNode* slow = head;
        if(head == nullptr || head->next == nullptr){
            return false;
        }
        while(fast != nullptr && fast->next != nullptr){
            slow = slow->next;
            fast = fast->next->next;
            if(fast == slow){
                return true;
            }
        }
        return false;
    }
142. 环形链表 II

这道题自己画图就知道了,本质就是一道数学题

  1. 判断有无环

  2. fig1

    a+(n+1)b+nc=2(a+b)⟹a=c+(n−1)(b+c)

    即a=c

  3. 当第一次相遇时,快指针回到头结点,慢指针不动。两个指针按照相同速度走,相遇点即为环的入口点。

ListNode *detectCycle(ListNode *head) {
    ListNode* slow = head;        
    ListNode* fast = head;        
    while(fast && fast->next){           
        slow = slow->next;            
        fast = fast->next->next;            
        if(slow == fast){                
            fast = head;                
            while(fast != slow){                    
                fast = fast->next;                    
                slow = slow->next;                
            }                
            return fast;            
        }        
    }        
    return nullptr;    
}
19. 删除链表的倒数第 N 个结点

当碰到链表第几个节点的时候,双指针的思想可能正合适。

我们可以设想假设设定了双指针 p 和 q 的话,当 q 指向末尾的 NULL,p 与 q 之间相隔的元素个数为 n 时,那么删除掉 p 的下一个指针就完成了要求。

img
ListNode* removeNthFromEnd(ListNode* head, int n) {        
    //双指针思想,以后这种倒数的长度类型的题目都可以用双指针        
    ListNode* p = head;        
    ListNode* q = head;       
    while(n>0){            
        p = p->next;            
        n--;        
    }        
    if(!p){            
        return head->next;        
    }        
    while(p->next){            
        p = p->next;            
        q = q->next;        
    }        
    q->next = q->next->next;       
    return head;    
}
24. 两两交换链表中的节点

思路:交换节点的题,就要有temp->next和temp->next->next。

如果 temp 的后面没有节点或者只有一个节点,则没有更多的节点需要交换,因此结束交换。否则,获得 temp 后面的两个节点 node1(temp->next)和 node2(temp->next->next),通过更新节点的指针关系实现两两交换节点。

下面是错误代码

ListNode* swapPairs(ListNode* head) {        
    ListNode* temp = new ListNode(-1);        
    temp->next = head;        
    while(temp->next&&temp->next->next){           
        ListNode* l1 = temp->next;           
        ListNode* l2 = temp->next->next;           
        temp->next = l2;           
        l1->next =l2->next;           
        l2->next = l1;           
        temp = l1;        
    }        
    return head;    
}

输入:1,2,3,4

输出:1,4,3

错误原因:注意这道题head节点指的是首节点!这是最重要一点。其次,最开始head节点为1,在上面代码交换结束后正常来说为2,1,4,3,但是,head节点此刻还是1,如果返回head,则2被漏掉

正确代码

ListNode* swapPairs(ListNode* head) {        
    ListNode* temp = new ListNode(-1);        
    temp->next = head;       
    ListNode* dummy = temp;        
    while(temp->next&&temp->next->next){           
        ListNode* l1 = temp->next;           
        ListNode* l2 = temp->next->next;           
        temp->next = l2;           
        l1->next =l2->next;           
        l2->next = l1;           
        temp = l1;        
    }        
    return dummy->next;    
}

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

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

相关文章

贵金属交易指南:如何在市场中获利?

贵金属市场一直以来都是投资者追逐利润的热门选择,然而,贵金属市场波动较大,在市场中获利并非易事。想要成功,需要理解市场动态和采取适当的策略。万洲金业将为您提供一些实用的贵金属交易指南,帮助您在市场中获利。 …

微服务学习|初识MQ、RabbitMQ快速入门、SpringAMQP

初识MQ 同步通讯和异步通讯 同步通讯是实时性质的,就好像你用手机与朋友打视频电话,但是,别人再想与你视频就不行了,异步通讯不要求实时性,就好像你用手机发短信,好多人都能同时给你发短信,你…

NX二次开发UF_CURVE_ask_curve_struct 函数介绍

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_ask_curve_struct Defined in: uf_curve.h int UF_CURVE_ask_curve_struct(tag_t curve_id, UF_CURVE_struct_p_t * curve_struct ) overview 概述 Gets the structure p…

notion 3.0.0 版本最新桌面端汉化教程,支持MAC和WIN版本

notion客户端汉化(目前版本3.0.0) 最近notion桌面端更新了3.0.0版本后会导致老版本汉化失效,本项目实现了最新版Notion桌面端的汉化。 文件下载地址:汉化文件下载地址 项目说明 本项目针对新的客户端做了汉化文化,依…

【知网稳定检索】第九届社会科学与经济发展国际学术会议 (ICSSED 2024)

第九届社会科学与经济发展国际学术会议 (ICSSED 2024) 2024 9th International Conference on Social Sciences and Economic Development 第九届社会科学与经济发展国际学术会议(ICSSED 2024)定于2024年3月22-24日在中国北京隆重举行。会议主要围绕社会科学与经济发展等研究…

数据结构与算法编程题20

统计二叉树的叶结点个数。 #define _CRT_SECURE_NO_WARNINGS#include <iostream> using namespace std;typedef char ElemType; #define ERROR 0 #define OK 1 typedef struct BiNode {ElemType data;BiNode* lchild, * rchild; }BiNode,*BiTree;bool Create_tree(BiTre…

Feign接口请求返回异常 no suitable HttpMessageConvert found for response type

问题场景&#xff1a; 后端调用feign接口请求, 接口返回异常, no suitable HttpMessageConvert found for response type 问题描述 报错异常如下&#xff1a; //根据图片特征 去查询人员信息ResultVo<List> personVos ipbdFaceLibPersonApi.queryFacePersonByFeatur…

HTTP状态码:404 Not Found错误之谜

文章目录 HTTP 404 Not Found错误 404出现形式导致 HTTP 404 错误的原因&#xff1f;推荐阅读 HTTP 404 Not Found 错误 404&#xff0c;也称为“HTTP 404 Not Found”&#xff0c;是当无法找到所请求的资源时 Web 服务器返回的HTTP 状态代码。 简单来说&#xff0c;这意味着…

机器学习探索计划——数据集划分

文章目录 导包手写数据划分函数使用sklearn内置的划分数据函数stratifyy理解举例 导包 import numpy as np from matplotlib import pyplot as plt from sklearn.datasets import make_blobs手写数据划分函数 x, y make_blobs(n_samples 300,n_features 2,centers 3,clus…

Linux中vim的编译链接和gcc

gcc,g,gdb的安装 命令行写gcc,g,gdb根据提示安装:sudo apt install gcc/g/gdb gcc分布编译链接 (1)预编译: gcc -E main.c -o main.i (2)编译: gcc -S main.i -o main.s (3)汇编: gcc -c main.s -o main.o (4)链接 gcc main.o -o main 执行: ./main 或者:全路径/main 编译链…

讲述 什么是鸿蒙 为什么需要鸿蒙 为什么要学习鸿蒙

首先 我们为什么要学习鸿蒙开发&#xff1f; 因为 鸿蒙发展前景巨大 鸿蒙自发布依赖 一直受社会各界关注 强两百的 App厂商 大部分接受了与鸿蒙的合作 硬件也有非常多与鸿蒙合作的厂商 鸿蒙的合作企业基本已经覆盖整个互联网客户的主流需求 所以鸿蒙的崛起不过是早晚的问题 …

NX二次开发UF_CURVE_ask_line_arc_data 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_ask_line_arc_data Defined in: uf_curve.h int UF_CURVE_ask_line_arc_data(tag_t line_arc_feat_id, UF_CURVE_line_arc_t * line_arc_data ) overview 概述 Populates…

远程网络安全访问JumpServer:使用cpolar内网穿透搭建固定公网地址

文章目录 前言1. 安装Jump server2. 本地访问jump server3. 安装 cpolar内网穿透软件4. 配置Jump server公网访问地址5. 公网远程访问Jump server6. 固定Jump server公网地址 前言 JumpServer 是广受欢迎的开源堡垒机&#xff0c;是符合 4A 规范的专业运维安全审计系统。JumpS…

小程序中的大道理之三--对称性和耦合问题

再继续扒 继续 前一篇 的话题, 在那里, 提到了抽象, 耦合及 MVC, 现在继续探讨这些, 不过在此之前先说下第一篇里提到的对称性. 注: 以下讨论建立在前面的基础之上, 为控制篇幅起见, 这里将不再重复前面说到的部分, 如果您还没看过前两篇章, 阅读起来可能会有些困难. 这是第一…

电源控制系统架构(PCSA)之系统控制处理器组件

目录 6.4 系统控制处理器 6.4.1 SCP组件 SCP处理器Core SCP处理器Core选择 SCP处理器核内存 系统计数器和通用计时器 看门狗 电压调节器控制 时钟控制 系统控制 信息接口 电源策略单元 传感器控制 外设访问 系统访问 6.4 系统控制处理器 系统控制处理器(SCP)是…

【LeetCode】每日一题 2023_11_24 统计和小于目标的下标对数目(暴力/双指针)

文章目录 刷题前唠嗑题目&#xff1a;统计和小于目标的下标对数目题目描述代码与解题思路 结语 刷题前唠嗑 LeetCode&#xff1f;启动&#xff01;&#xff01;&#xff01; 题目&#xff1a;统计和小于目标的下标对数目 题目链接&#xff1a;2824. 统计和小于目标的下标对数…

Kafka 集群如何实现数据同步

Kafka 介绍 Kafka 是一个高吞吐的分布式消息系统&#xff0c;不但像传统消息队列&#xff08;RaabitMQ、RocketMQ等&#xff09;那样能够【异步处理、流量消峰、服务解耦】 还能够把消息持久化到磁盘上&#xff0c;用于批量消费。除此之外由于 Kafka 被设计成分布式系统&…

Qt 软件调试(二)使用dump捕获崩溃信息

Qt应用程序异常崩溃该怎么办&#xff0c;生成dump文件再回溯分析&#xff0c;可以快速且准确的帮助我们定位到崩溃的点。那么&#xff0c;本章我们分享下如何在Qt中生成dump文件。 一、使用minudump捕获崩溃信息 #include <QCoreApplication> #include <QDir> #i…

判断序列Series中的值是否都不一样 PandasSeries中的方法:is_unique()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 判断序列Series中的值是否都不一样 PandasSeries中的方法&#xff1a; is_unique() 选择题 请问下列程序运行的的结果是&#xff1a; import pandas as pd s1 pd.Series([1,2,3]) print("…

[PyTorch][chapter 64][强化学习-DQN]

前言&#xff1a; DQN 就是结合了深度学习和强化学习的一种算法&#xff0c;最初是 DeepMind 在 NIPS 2013年提出&#xff0c;它的核心利润包括马尔科夫决策链以及贝尔曼公式。 Q-learning的核心在于Q表格&#xff0c;通过建立Q表格来为行动提供指引&#xff0c;但这适用于状态…