20/100 删除链表的倒数第 N 个结点 21/100 有效的括号 22/100 合并两个有序列表

news2024/11/15 12:27:10

20/100 删除链表的倒数第 N 个结点

题目:

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
在这里插入图片描述

题解:

方法1:第一次完整遍历一遍得到长度,第二次遍历到倒数第n个数据前一个,进行删除

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        int len = 0;
        ListNode* p = head;
        
        // 遍历一遍,得到链表长度
        while(p)
        {
            len++;
            p = p->next;
        }
        
        // 重新指向头节点
        p = head;
        ListNode* pre = nullptr;

        // 移动到倒数第N个节点的前一个节点
        for(int i = 1; i < len - n + 1; i++)
        {
            pre = p;
            p = p->next;
        }

        if (pre) {
           if (p) {//注意避免空指针问题
                pre->next = p->next;
                delete p;
            }
            return head;
        } else {
            // 如果pre为空,说明删除的是头节点
            ListNode* newHead = head->next;
            delete head;
            return newHead;
        }
    }
};

方法2: 双指针

双指针,第一个指针先往前走n, 再一起走,直到第一个指针走到最后一个, 此时第二个指针刚到要删除指针的前一个

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* fast = head;
        ListNode* slow = head;
        
        // 将第一个指针先往前走n步
        for(int i = 0; i < n; i++)
        {
            if (fast) {
                fast = fast->next;
            } else {
                // 处理链表长度小于n的情况
                return head;
            }
        }
        
        // 一起移动两个指针,直到第一个指针走到最后一个
        while(fast && fast->next)
        {
            fast = fast->next;
            slow = slow->next;
        }
        
        // slow到要删除节点的前一个了
        if (slow && slow->next) {
            ListNode* x = slow->next;
            slow->next = slow->next->next;
            delete x;
            return head;
        } else {
            // 处理删除头节点的情况
            ListNode* newHead = head->next;
            delete head;
            return newHead;
        }
    }
};

注意:没有全部过case,应该是边界问题,有点困qiu,下把再试吧==

题目: 21/100 有效的括号

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

题解:

用栈 当出现左边的符号时入栈,如果出现了右边的符号,栈顶元素应该是对称的那个符号

class Solution {
public:
    bool isValid(string s) {
        int n = s.size();
        if(n %2 != 0) return false;
        stack<char> stk;
        unordered_map<char, char> pairs = {
            {')','('},
            {']','['},
            {'}','{'}};

        for(auto c : s)
        {
            if(c == '[' || c == '(' || c == '{')
            {
                stk.push(c);  
            }else
            {
                //是右边的符号
                // if(pairs[c] == stk.top() && !stk.empty())
                if(!stk.empty() && pairs[c] == stk.top())//应该先判空再判断是否相等
                {
                    stk.pop();
                }else{
                    //不配对
                    return false;
                }
            }
        }
        // return true;
        return stk.empty();

    }
};


题目: 22/100 合并两个有序列表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
在这里插入图片描述

题解:

两个链表比较,把小的放到新链表中,第一次完全么有调试就一遍过了hhh,虽然是最暴力最简单的方式,但也有一点点开心。
但看了题解之后,发现人家的代码写的是真简介呀==

/**
 * 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) {
        if (list1 == nullptr)
            return list2;
        if (list2 == nullptr)
            return list1;

        ListNode* dummy = new ListNode(0);
        ListNode* ptr = dummy;
        ListNode* p1 = list1;
        ListNode* p2 = list2;
        while (p1 && p2) {
            while (p1 && p2 && p1->val > p2->val) {
                ListNode* newNode = new ListNode(0);
                newNode->val = p2->val;
                ptr->next = newNode;
                ptr = ptr->next;

                p2 = p2->next;
            }

            while (p1 && p2 && p1->val <= p2->val) {
                ListNode* newNode = new ListNode(0);
                newNode->val = p1->val;
                ptr->next = newNode;
                ptr = ptr->next;

                p1 = p1->next;
            }
        }

        while (p1) {
            ListNode* newNode = new ListNode(0);
            newNode->val = p1->val;
            ptr->next = newNode;
            ptr = ptr->next;

            p1 = p1->next;
        }

        while (p2) {
            ListNode* newNode = new ListNode(0);
            newNode->val = p2->val;
            ptr->next = newNode;
            ptr = ptr->next;

            p2 = p2->next;
        }

        return dummy->next;
    }
};

//创建三个指针

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

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

相关文章

矩阵起源携手深智城入选中国信通院“星河”案例

近日&#xff0c;由中国信息通信研究院和中国通信标准化协会大数据技术标准推进委员会&#xff08;CCSA TC601&#xff09;共同组织的 2023 大数据“星河&#xff08;Galaxy&#xff09;”案例征集活动评选结果现已公示。案例征集自9月启动以来&#xff0c;受到了业界广泛关注和…

图文看懂Android的Matrix原理

Matrix结构 在Android开发中&#xff0c;矩阵是一个非常强大且有趣的工具。位于图形库中&#xff0c;android.graphics.Matrix 是一个 33 的 float 矩阵&#xff0c;其主要作用是坐标变换。 它的结构大概是这样的&#xff1a; 其中每个位置的数值作用和其名称所代表的的含义是…

基于Java SSM框架实现雁门关风景区宣传网站项目【项目源码】计算机毕业设计

基于java的SSM框架实现雁门关风景区宣传网站演示 Java技术 Java技术它是一个容易让人学会和使用的一门服务器语言。它在编程的过程当中只需要很少的知识就能建立起一个真正的交互站点。对于这个教程来说它并不需要你完全去了解这种语言&#xff0c;只要能快速融入web站点就可以…

互信息法的原理详解

文章目录 互信息法&#xff08;上&#xff09;互信息是什么从信息增益角度理解互信息从变量分布一致角度理解互信息 卡方检验与离散变量的互信息法 互信息法&#xff08;上&#xff09; 尽管f_regression巧妙的构建了一个F统计量&#xff0c;并借此成功的借助假设检验来判断变…

拼夕夕的拼团模式已经过时!全新拼团模式你可以看一下!

全民拼购&#xff0c;这个新兴的社交电商模式&#xff0c;正以令人惊叹的速度重塑消费者的购物体验。通过与亲朋好友的互动&#xff0c;消费者不仅能享受到购物的乐趣&#xff0c;还能获得实实在在的优惠和福利。 在全民拼购的世界里&#xff0c;用户不再只是孤立的消费者。他们…

给视频添加动图,让视频更具动感与活力

相较于静态图片和文字&#xff0c;GIF动图能更直观地传达信息&#xff0c;为内容增添趣味性。那么&#xff0c;该如何给你的视频添加GIF动图&#xff0c;使其更具吸引力呢&#xff1f;接下来&#xff0c;让我们一起探讨这个话题。 所需工具&#xff1a; 一个【视频剪辑高手】…

CMVAE

use the encoder to obtain two sets of output: 1) (μ i ( m m ) ^{(mm)}_i i(mm)​,σ i ( m m ) ^{(mm)}_i i(mm)​) and 2) (μ i ( m t ) ^{(mt)}_i i(mt)​,σ i ( m t ) ^{(mt)}_i i(mt)​) 作者未提供代码

trilium笔记私有化部署

前言&#xff1a;一直用有道云笔记&#xff0c;随着笔记越多&#xff0c;每次搜索跟打开都感觉没那么顺畅。再考虑到数据安全问题&#xff0c;想着有没私有化部署的笔记&#xff0c;于是开始探索私有化部署笔记。 为知笔记&#xff1a;比较早之前&#xff0c;家里的NAS部署过为…

能见度监测站在交通中有哪些作用

【TH-NJD10】能见度监测站在交通中的作用主要体现在以下几个方面&#xff1a; 提高交通安全&#xff1a;能见度是影响交通安全的重要因素之一。能见度监测站可以实时监测并发布路面或空中的能见度数据&#xff0c;帮助驾驶员和交通管理部门做出安全决策。在低能见度情况下&…

5、MAE:探索视觉预训练模型

目录 1、论文 2、背景与动机 3、回答的问题 4、创新与卖点 5、实现细节 模型框架 具体步骤 简单代码示例 6、一些资料 1、论文 Masked Autoencoders Are Scalable Vision Learnershttps://arxiv.org/pdf/2111.06377.pdf 2、背景与动机 在深度学习和计算机视觉的领域中…

【实用技巧】Steam Wallpaper Engine 壁纸引擎向手机导入壁纸方法

一、内容简介 本文介绍如何使用电脑上的 Wallpaper Engine &#xff08;Steam 平台中的壁纸引擎&#xff09;向安卓手机导入并使用壁纸。 二、所需原材料 安卓手机&#xff08;以笔者使用的华为荣耀50为例&#xff09;、安装有Steam以及Wallpaper Engine的电脑 三、导入方法…

美摄视频SDK,卓越的视频解决方案

视频已经成为企业传播信息、展示品牌形象的重要工具。然而&#xff0c;高质量的视频制作并不容易&#xff0c;需要专业的技术和设备支持。这就是我们的美摄科技视频SDK发挥作用的地方。作为一家专注于视频技术开发的公司&#xff0c;我们的目标是为企业提供最优质的视频解决方案…

缓存学习实战篇

缓存练习题&#xff08;用户查询操作&#xff09; public List<ShopType> queryAllType() throws JsonProcessingException {//从缓存中查数据String shopTypeJson stringRedisTemplate.opsForValue().get("cache:shopType");//如果缓存命中&#xff0c;if (S…

Linux内存管理:(八)页面迁移

文章说明&#xff1a; Linux内核版本&#xff1a;5.0 架构&#xff1a;ARM64 参考资料及图片来源&#xff1a;《奔跑吧Linux内核》 Linux 5.0内核源码注释仓库地址&#xff1a; zhangzihengya/LinuxSourceCode_v5.0_study (github.com) 1. 可迁移页面 页面迁移机制支持两…

VUE+bpmn.js实现工作流

1、安装bpmn.js npm install bpmn-js7.3.1 // 我安装的版本是7.3.1npm install bpmn-js-properties-panel0.37.2npm install bpmn-moddle7.1.3 npm install --save camunda-bpmn-moddle 2、配置axios&#xff0c;在main.js中引入axios import axios from axiosVue.proto…

Dcoker构建部署Java项目过程

目录 前言 一、打包 二、Docker File文件编写 一个简单的Docker File文件 三、上传文件 四、构建镜像 五、运行 六、端口开放 前言 使用Dcoker构建部署Java项目&#xff0c;发布到服务器 一、打包 我这里打包的是item-service这个module&#xff0c;clean-cpmpile-pa…

【深度学习每日小知识】Logistic Loss 逻辑回归

逻辑回归的损失函数 线性回归的损失函数是平方损失。逻辑回归的损失函数是对数损失&#xff0c;定义如下&#xff1a; L o g L o s s ∑ ( x , y ) ∈ D − y log ⁡ ( y ′ ) − ( 1 − y ) log ⁡ ( 1 − y ′ ) LogLoss\sum_{(x,y)\in D}-y\log(y)-(1-y)\log(1-y) LogLoss…

测试老鸟汇总,接口测试总结与用例编写,一文策底概全...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、为什么要做接口…

Java SE入门及基础(9)

if选择结构 1. 基本if选择结构 语法 if ( 条件 ){ // 如果条件满足&#xff0c;则执行代码块 //代码块 } 案例 从控制台输入一个整数&#xff0c;如果该数字小于 10 &#xff0c;则输出 10 与该数字的差值。 流程图 代码实现 public class Example1 { public s…

Dart 空感知操作符:??

示例 写了如下代码&#xff1a; var str1 "hello"; var str2 "world"; var result str1 ?? str2.toUpperCase(); //如果str1不为空&#xff0c;则执行后面的语句 print(result); 代码可以正常执行&#xff0c;但是报了如下错误&#xff1a; Warnin…