力扣top100-链表类题易错点总结-c++实现(更新中)

news2024/9/20 7:54:42
  • 首先给一个我之前写的双指针在链表类题中的妙用的link:双指针在链表中的妙用

tip1 来自“合并两个有序链表”

题目链接戳这里
在这里插入图片描述
在这里插入图片描述

  • 这道题注意的就是如果是要返回一个新链表的头结点,一定要新建一个头结点:
ListNode* prehead = new ListNode(-1); 
  • 之后再对prehead的next进行添加,而不是对传进来的参数节点(比如list1)进行遍历、或其他改变后,再直接返回参数节点(当list1遍历的时候指向了尾结点,这样就找不到开始的头结点了)!
  • 代码如下
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
        ListNode* prehead = new ListNode(-1); // 申请一片新的空间的办法
        ListNode* pre = prehead; // 暂时指向这片区域,然后之后只更改next
        while (list1 != nullptr && list2 != nullptr) {
            if (list1->val > list2->val) {
                pre->next = list2;
                list2 = list2->next;
            } else {
                pre->next = list1;
                list1 = list1->next;
            }
            pre = pre->next;
        }
        if (list1 != nullptr)
            pre->next = list1;
        else if (list2 != nullptr)
            pre->next = list2;
        return prehead->next;
    }
};

跟上上一道题的方法,如果是新建节点怎么做?

  • 用“双数相加”来说,题目链接:link

在这里插入图片描述
在这里插入图片描述

  • 必须用的方法是,不能自己猜想链表结构写别的代码:
//j%10的位置写新的val
//然后插入下一个点
ListNode* temp = new ListNode(j % 10);
            pre->next = temp;
  • 题目的代码如下
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode* preHead = new ListNode(-1);
        ListNode* pre = preHead;
        int j = 0;
        // 模拟的思路
        while (l1 != nullptr || l2 != nullptr || j != 0) {
            int n1 = l1 ? l1->val : 0;
            int n2 = l2 ? l2->val : 0;
            j = j + n1 + n2;
            // 插入新节点一定要用这种新建的方式
            ListNode* temp = new ListNode(j % 10);
            pre->next = temp;
            j = j / 10;
            pre = pre->next;
            if (l1)
                l1 = l1->next;
            if (l2)
                l2 = l2->next;
        }
        // 结束条件 l1加完了 或者l2加完了

        return preHead->next;
    }
};

另一道用快慢指针的题

  • 所以head不能动,但是可以新建指针指向head,并移动新的指针!
    题目链接

在这里插入图片描述
在这里插入图片描述

  • 思路就是快慢指针,快指针比慢指针先走n-1步,当慢指针指向末尾的时候,快指针指向的节点就是待删除的节点
  • 该思路满足“进阶”思路中的“一遍扫描”!
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        // 删除链表的倒数第n个节点
        // 想保留头结点,就新建一个节点去动!
        // head千万不能动,建立两个快慢指针!
        ListNode* preHead = new ListNode(-1);
        preHead->next = head;
        ListNode* fast = preHead;
        ListNode* slow = preHead;
        if (!head->next && n == 1)
            return nullptr;
        int count = n - 1; // 先让fast
        while (fast != nullptr && count) {
            fast = fast->next;
            count--;
        }
        // 直到fast 这个逻辑有点问题 改一下!
        while (fast != nullptr && fast->next != nullptr &&
               fast->next->next != nullptr) {
            fast = fast->next;
            slow = slow->next;
        }
        // 当前的fast指向倒数第二个节点
        ListNode* slow2 = slow; // 1
        slow2 = slow2->next;    // 2
        // fast=fast->next;
        // 此时fast指向了最后一个节点;slow2这个点是要被去除的
        slow->next = slow2->next; // 成功去除
        return preHead->next;
    }
};

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

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

相关文章

备考计算机二级Python之Day5

第5章 函数和代码 一、函数的基本使用 函数是一段具有特定功能的、可重用的语句组,通过函数名来表示和调用。 函数的使用包括两部分:函数的定义和函数的使用 1、函数的定义 Python语言通过保留字def定义函数,语法形式如下: …

判别分析2|Bayes判别分析|Fisher判别分析|软件求解

Bayes判别分析 引入先验信息 距离判别只要求知道总体的数字特征,不涉及总体的分布函数 当均值和协方差未知时,就用样本的均值和协方差矩阵做估计值。距离判别方法简单实用,但没有考虑到每个总体出现的机会大小,即先验概率&#…

数据结构(邓俊辉)学习笔记】优先级队列 09——左式堆:合并算法

文章目录 1. LeftHeap模板类2. 算法3. 实现4. 实例 1. LeftHeap模板类 接下来这节,来讨论左式堆的合并算法。再给出具体算法之前,首先要给出左式堆模板类的定义。 比如这就是一种可能的实现方式,可以看到,我们这里再次利用了 C…

srm供应商一体化招采系统解决方案,需求功能清单以及源码实现(JAVA)

1. 供应商管理 2. 采购需求管理 3. 采购寻源管理 4. 采购合同管理 5. 采购订单管理 6. 采购协同管理 7. 外部商城采购管理 8. 报表查询管理 9. 系统管理 10. 集成管理 资料获取:本文末个人名片。

在Activity中使用Menu

在Activity中使用Menu 手机毕竟和电脑不同,它的屏幕空间非常有限,因此充分地利用屏幕空间在手机界面设计中就显得非常重要了。如果你的活动中有大量的菜单需要显示,这个时候界面设计就会比较尴尬,因为仅这些菜单就可能占用屏幕将…

构建高效的串行任务执行器:SerialExecutor深度解析

本文主要介绍怎么去实现一个支持串行执行任务的SerialExecutor执行器 摘要 在复杂的异步编程中,有时我们需要确保任务以串行的方式执行,以维护任务间的依赖关系或顺序。SerialExecutor 是一个自定义的执行器,它封装了 Java 的 Executor 接口…

Linux磁盘分区,增加磁盘应用实例,磁盘情况查询

目录 linux磁盘分区机制 原理介绍 示意图 硬盘说明 查看所有设备挂载情况 挂载的经典案例 给虚拟机添加硬盘 分区 删除挂载 永久挂载 磁盘情况查询 查询系统整体磁盘使用情况 查询指定目录的磁盘占用情况 linux磁盘分区机制 原理介绍 载入可以将一个分区和一个目录…

【精选】基于微信小程序的地铁站点查询系统(全网独一无二,阿龙原创设计)

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

C#入门篇3

目录 一、练习 二、显示类型转换(强制类型转换) 三、Convert的转换工厂转换 四、算数运算符号之( /--) 五、关系运算符(比较运算) 六、逻辑运算符 七、复合运算符 一、练习 计算半径为5的圆的面积和周…

Windows平台SDKMAN工具使用

为方便jvm生态的软件版本管理,可以使用sdkman工具来安装和管理诸如java、gradle等软件的当前使用版本。尤其是大多数程序员都是在windows平台开发,团队开发通常都需要统一的jvm相关软件的版本。这里给大家演示下windows平台如何安装和使用sdkman来实现这…

普元EOS-自定义SDO代码生成模板

1 前言 普元EOS的数据实体生成SDO接口和实现类的代码,可以通过自定义代码生成模板,实现代码自定义。 2 模板存放位置 模板存放位置如下:安装目录/dropins/eostools/com.primeton.studio.entity.ui-x.x.x.x.jar里面,SDO模版都在/…

揭秘CAAC、AOPA、ALPA、ASFC和UTC无人机执照的差别及实用价值

CAAC、AOPA、ALPA、ASFC和UTC无人机执照各有其独特的差别及实用价值,以下是针对这些执照的详细解析: 一、CAAC无人机执照 颁发机构:中国民用航空局(CAAC) 差别: - 权威性:CAAC无人机执照是目…

Go机器学习框架之火重燃,Google前研究员开源期望媲美Jax的GoMLX

Go作为一门兼具高性能与简洁性的编程语言,近年来在各种领域得到广泛应用。然而,在机器学习领域,Go相比Python、C、Julia等语言,生态仍然较为薄弱。目前的Go机器学习框架无论在功能全面性上,还是在社区生态支持上都难以…

2024升级zblog小程序开源源码/基于uniapp开发的(支持微信小程序、百度小程序、安卓APP)

源码简介: 2024最新zblog多端小程序开源源码,它是基于uniapp开发的,它是针对和支持微信小程序、百度小程序和安卓APP哦!百度百科小程序源码下载。 这个基于uniapp开发的zblog多端小程序开源源码,听说对收录和SEO都有…

Android 添加系统服务的实现

和你一起终身学习,这里是程序员Android 本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以下内容: 一、前言二、编写AIDL文件三、编写Manager类四、 编写系统服务五、 注册系统服务六、注册Manager七、App调用八、添…

设计模式 -- 七大原则(五)-- 开闭原则

1 基本介绍 开闭原则(Open Closed Principle,简称OCP)是编程中最基础、最重要的设计原则 一个软件实体如类,模块和函数应该对扩展开放(对提供方),对修改关闭(对使用方)。用抽象构建框架,用实现扩展细节。 …

伯努利朴素贝叶斯解析:面向初学者的带代码示例的视觉指南

通过二进制简单性释放预测能力,欢迎来到雲闪世界。 添加图片注释,不超过 140 字(可选) 与虚拟分类器的基线方法或基于相似性的 KNN 推理不同,朴素贝叶斯利用了概率论。它结合了每个“线索”(或特征&#xf…

宿舍管理系统设计与分析

第一章 管理信息系统概述 在人类进入21世纪之际,随着社会的组织化程度以及企业生产的社会化程度越来越高,信息作为一种资源已经和材料、能源并称为现代社会化发展的三大支柱之一。管理信息系统是融科学、信息科学、系统工程以及现代通讯技术、计算机技术…

阿里HPN-大型语言模型训练的数据中心网络架构

阿里巴巴HPN:用于大型语言模型训练的数据中心网络 摘要 本文介绍了阿里云用于大型语言模型(LLM)训练的数据中心网络HPN。由于LLM和一般云计算之间的差异(例如,在流量模式和容错性方面),传统的数据中心网络不太适合LLM训练。这就要求我们专门为LLM培训设…

【NetTopologySuite类库】多边形的五种包围盒(AABB、OBB、包围圆、八边形、凸包)

示例 用的是NetTopologySuite1.5.3版本。 var r new WKTReader(); var wkt "polygon((0 0,0 0.5,1 2,5 0,4 -2,3 -1, 0 0))"; var rawGeo r.Read(wkt); var b1 rawGeo.Envelope;//AABB var b2 new MinimumBoundingCircle(rawGeo).GetCircle();//包围圆 var b3…