LeetCode 热题 100 | 链表(中上)

目录

1  141. 环形链表

1.1  哈希表

1.2  快慢指针

2  142. 环形链表 II

2.1  哈希表

2.2  快慢指针

3  21. 合并两个有序链表

4  2. 两数相加


菜鸟做题第三周,语言是 C++

1  141. 环形链表

1.1  哈希表

解题思路:遍历链表,在哈希表中查询当前节点地址是否已经存在。若存在,则证明该链表有环,返回 True;若不存在,则将当前节点地址存入哈希表中。如果能够遍历完毕,则返回 False 。

class Solution {
public:bool hasCycle(ListNode *head) {ListNode * p = head;unordered_set<ListNode *> set;while (p) {if (set.find(p) != set.end()) return true;set.insert(p);p = p->next;}return false;}
};

1.2  快慢指针

解题思路:

  1. 设置一快一慢指针
  2. 快指针每次移动两格,慢指针每次移动一格
  3. 如果快指针能够遇上慢指针,那么链表中存在环

思路说明图:

一开始我会想,兔子一定会在同一节点追上乌龟吗?会不会存在,虽然兔子从后面追上了乌龟,但是直接把乌龟超过了。那循环终止的条件怎么写啊?答案是,不存在这种情况。

巧妙之处就在,兔子虽然快,但是也只是每次移动两格。兔子和乌龟每次产生的差距都为 1,而 1 又是所有整数的因子。因此,假设兔子要从后面追上乌龟,且现在的距离为 N,那么经过 N 个时刻后兔子一定追上乌龟,即它们会相遇。

但如果兔子每次移动的不是两格,它和乌龟每次产生的差距为 d,那么就要考虑 N 能不能被 d 整除了。所以兔子每次移动两格不是随便设置的,而是有一定科学依据的。

class Solution {
public:bool hasCycle(ListNode *head) {if (head == nullptr) return false;ListNode * slow = head;ListNode * fast = head->next;while (slow != fast) {if (fast == nullptr || fast->next == nullptr) return false;slow = slow->next;fast = fast->next->next;}return true;}
};

2  142. 环形链表 II

2.1  哈希表

和上一题的代码几乎一模一样,只是返回的内容不同。

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

2.2  快慢指针

虽然用哈希表直接秒了,但是用快慢指针也是能做的。。。

请参考官方题解

3  21. 合并两个有序链表

解题思路:

  1. 设置 p 和 q 指针分管两条链
  2. 比较 p 和 q 所指向的节点的值
  3. 按照从小到大的顺序重新连接

注意:不是发现 p->val 小于 q->val 就赶紧重新连接,而是要让 p 继续往后找,找到最后一个小于 q->val 的 p->val,然后才重新连接。否则,不仅违背了从小到大的排序规则,还丢失了节点之间原本的连接。对于 q->val 小于 p->val 的情况同理。

思路说明图:这四幅图的顺序是从左到右,从上到下。

对于 p->val == q->val 的情况,哪边连哪边都无所谓。

class Solution {
public:ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {if (list1 == nullptr && list2 == nullptr) return nullptr;if (list1 == nullptr) return list2;if (list2 == nullptr) return list1;ListNode * p = list1, * q = list2;while (p && q) {if (p->val <= q->val) {while (p->next && p->next->val <= q->val) p = p->next;ListNode * temp = p->next;p->next = q;p = temp;} else if (p->val >= q->val) {while (q->next && p->val >= q->next->val) q = q->next;ListNode * temp = q->next;q->next = p;q = temp;}}return list1->val <= list2->val ? list1 : list2;}
};

说明:这两行代码就是我说的 “要让 p 或 q 继续往后找”

while (p->next && p->next->val <= q->val) p = p->next;
while (q->next && p->val >= q->next->val) q = q->next;

4  2. 两数相加

这道题比我想象的简单,我以为要算最后的总和,结果只需要算每一位的结果

解题思路:

  • 设置进位 carry
  • 每一位结果 = (p->val + q->val + carry) % 10
  • 如果 p->val + q->val + carry > 10,则新的 carry = 1

最重要的其实是 l1 和 l2 可能不一样长,因此需要考虑一条链表已经遍历完毕,而另一条链表还没有遍历完毕的情况。因此进行了如下处理:

int n1 = p ? p->val : 0;
int n2 = q ? q->val : 0;
// ...
if (p) p = p->next;
if (q) q = q->next;

如果 p 或者 q 遍历完了,那么用 0 参加加法运算即可。

class Solution {
public:ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {ListNode * head = new ListNode(0), * tail = head;int carry = 0;ListNode * p = l1, * q = l2;while (p || q) {int n1 = p ? p->val : 0;int n2 = q ? q->val : 0;int sum = n1 + n2 + carry;tail->next = new ListNode(sum % 10);tail = tail->next;carry = sum / 10;if (p) p = p->next;if (q) q = q->next;}if (carry) {tail->next = new ListNode(carry);}return head->next;}
};

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

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

相关文章

Linux下grep命令详解

grep #文件内容过滤显示 #在指定的普通文件中查找并显示含有指定字符串的行&#xff0c;也可与管道符一起使用格式&#xff1a; grep-参数 查找条件 文件名 参数&#xff1a; 示例&#xff1a; [rootnode1 ~]# grep -n "root" /etc/passwd # -n&a…

Vue3学习记录(一)--- 组合式API之基础概念和变量声明

一、组合式API基础 1、简介 ​ 组合式 API (Composition API) 是Vue3和Vue2的v2.7之后版本中的全新特性&#xff0c;是一系列API的的集合&#xff08;响应式API、生命周期钩子、依赖注入等等&#xff09;&#xff0c;其风格是基于函数的组合&#xff0c;以一种更直观、更灵活…

【Unity3D小技巧】Unity3D中UI控制解决方案

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 在开发中总是会控制UI界面&#xff0c;如何优雅的控制UI界面是…

02-Java抽象工厂模式 ( Abstract Factory Pattern )

抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;是围绕一个超级工厂创建其他工厂 该超级工厂又称为其他工厂的工厂 在抽象工厂模式中&#xff0c;接口是负责创建一个相关对象的工厂&#xff0c;不需要显式指定它们的类 每个生成的工厂都能按照工厂模式提供对象 …

CDS view与替代对象

一&#xff0c;简介 替代对象是指用一个CDS view指派给一个透明表或常规数据库视图&#xff0c;使得透明表或常规数据库视图的访问重定向到该CDS view。 替代有诸多要求&#xff1a; 字段数量一致且同名对应&#xff0c;顺序可以不一致对应的字段数据类型长度等必须一致CDS v…

在Linux下搭建自己的私有maven库并部署和发布自定义jar依赖和自定义maven插件(三)开发和发布自己开发的maven插件

系列文章目录 在Linux下搭建自己的私有maven库并部署和发布自定义jar依赖和自定义maven插件(二)发布自己开发的jar包 文章目录 系列文章目录在Linux下搭建自己的私有maven库并部署和发布自定义jar依赖和自定义maven插件(二)发布自己开发的jar包 前言一、插件需求二、maven自定…

前端JavaScript篇之对 rest 参数的理解、ES6中模板语法与字符串处理

目录 对 rest 参数的理解ES6中模板语法与字符串处理 对 rest 参数的理解 rest参数是一种在函数定义中使用的特殊语法&#xff0c;它允许函数接受任意数量的参数&#xff0c;并将它们收集到一个数组中。通俗地说&#xff0c;rest参数就像是一个容器&#xff0c;用来存放函数接收…

帮管客CRM SQL注入漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

2024年美赛B题:寻找潜水器 Searching for Submersibles 思路模型代码解析

2024年美赛B题&#xff1a;寻找潜水器 Searching for Submersibles 思路模型代码解析 【点击最下方群名片&#xff0c;加入群聊&#xff0c;获取更多思路与代码哦~】 问题翻译 海上游轮迷你潜艇&#xff08;MCMS&#xff09;是一家位于希腊的公司&#xff0c;专门制造能够将人…

如何在Windows部署GoLand并通过SSH远程连接Linux服务器

文章目录 1. 安装配置GoLand2. 服务器开启SSH服务3. GoLand本地服务器远程连接测试4. 安装cpolar内网穿透远程访问服务器端4.1 服务器端安装cpolar4.2 创建远程连接公网地址 5. 使用固定TCP地址远程开发 本文主要介绍使用GoLand通过SSH远程连接服务器&#xff0c;并结合cpolar内…

Vue 环境准备

1.安装vscode https://code.visualstudio.com/ 2.安装开发vue所需插件&#xff1a; Vetur —— 语法高亮、智能感知、Emmet等 包含格式化功能&#xff0c; AltShiftF &#xff08;格式化全文&#xff09;&#xff0c;CtrlK CtrlF&#xff08;格式化选中 代码&#xff0c;两…

在 Elastic Agent 中为 Logstash 输出配置 SSL/TLS

要将数据从 Elastic Agent 安全地发送到 Logstash&#xff0c;你需要配置传输层安全性 (TLS)。 使用 TLS 可确保你的 Elastic Agent 将加密数据发送到受信任的 Logstash 服务器&#xff0c;并且你的 Logstash 服务器从受信任的 Elastic Agent 客户端接收数据。 先决条件 确保你…

防御保护 防火墙的双机热备和带宽管理实验

需求&#xff1a; 办公区设备可以通过电信和移动链路上网&#xff08;多对多的NAT&#xff0c;并需要保留一个公网IP不能用来转换&#xff09;分公司设备可以通过总公司的移动和电信链路访问DMZ区的http服务器分公司内部的客户端可以通过公网地址访问到内部的服务器FW1和FW4组…

Unity | YooAssetV2.1.0 + HybridCLR热更新

目录 一、项目更改 二、使用YooAsset热更 1.资源配置 2.资源构建 3.将两个文件夹下的资源上传CDN服务器 4.修改代码 5.运行效果 本文记录利用YooAssetHybridCLR来进行资源和dll的更新。YooAsset使用的是新版V2.1.0。相比于旧版&#xff0c;dll(原生文件)和资源要建两个p…

AI-数学-高中-18-三角函数-同角三角函数关系及计算

原作者视频&#xff1a;三角函数】5同角三角函数关系&#xff08;易中档&#xff09;_哔哩哔哩_bilibili 辅助三角形&#xff08;计算速度快&#xff09;&#xff1a;1.画一个辅助计算的任意直接三角形&#xff1b;2.利用初中方法先计算sin、cos、tan值&#xff1b;3.看象限确定…

Python机器学习:样本划分之验证集法

评估机器学习模型优劣的标准是模型的泛化能力&#xff0c;所以关注的应该是泛化误差而不是经验误差&#xff0c;一味追求经验误差的降低&#xff0c;就会导致模型“过拟合”现象。但是泛化误差是难以直接观察到的&#xff0c;我们应该如何选择泛化能力比较好的模型呢&#xff1…

蓝桥杯---垒骰子

赌圣atm晚年迷恋上了垒骰子&#xff0c;就是把骰子一个垒在另一个上边&#xff0c;不能歪歪扭扭&#xff0c;要垒成方柱体。经过长期观察&#xff0c;atm 发现了稳定骰子的奥秘&#xff1a;有些数字的面贴着会互相排斥&#xff01;我们先来规范一下骰子&#xff1a;1的对面是4&…

【Docker篇】Linux安装Docker、docker安装mysql、redis、rabbitmq

1.Linux安装docker 官方帮助文档&#xff1a;Install Docker Engine on CentOS | Docker Docs 1.1安装命令 # 1. 卸载之前的dockersudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate…

RK3568平台 安卓hal3适配usb camera

一.RK安卓hal3 camera框架 Camera hal3 在 android 框架中所处的位置如上图&#xff0c; 对上&#xff0c;主要实现 Framework 一整套 API 接口&#xff0c;响应其 控制命令&#xff0c;返回数据与控制参数结果。 对下&#xff0c; 主要是通 V4l2 框架实现与 kernel 的交互。3a…

linux 下mongodb7版本怎么连?

概述&#xff1a;linux下的mongodb7版本默认是没有安装客户端的&#xff0c;需要下载shell客户端才能连&#xff0c;下载之后解压&#xff0c;不需要编译&#xff0c;进入bin目录就能自己运行&#xff0c;。 安装&#xff1a; linux 下mongodb7版本没有安装客户端需要当地下载…