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…

Flink 添加 / 部署 Jar 包的若干注意事项

Flink 添加 / 部署 Jar 包可根据 Jar 包的声明周期、作用范围选择不同的附属方式&#xff0c;从实际应用上来看&#xff0c;可以分成以下几种场景&#xff1a; 普遍使用的框架或基础设施级别的 Jar 包&#xff0c;例如 Kafka、Hive、Hudi 等 Connector 的Jar 包&#xff0c;应…

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自定…

H5调用安卓原生相机API案例

1、在activity_main.xml文件里添加webview标签 <WebViewandroid:id="@+id/webview"android:layout_width="match_parent"android:layout_height="match_parent"> </WebView> 2、AndroidManifest.xml(权限和活动声明) 开启访问…

如何准备明年游戏行业春招

大学校园招聘一般分春招和秋招。对于很多即将毕业的同学来说&#xff0c;如果秋招时没有收获合适的offer&#xff0c;那么春招就是最后的求职机会。此时更应珍惜&#xff0c;全力以赴。 许多游戏大厂通常会在校招开放基础岗位&#xff0c;这是进入游戏公司的捷径。校招时你的主…

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

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

2024/2/2

第一章 命名空间 一&#xff0e;选择题 1、编写C程序一般需经过的几个步骤依次是&#xff08; B &#xff09; A. 编辑、调试、编译、连接 B. 编辑、编译、连接、运行 C. 编译、调试、编辑、连接 D. 编译、编辑、连接、运行 2、所谓数据封装就是将一组数据和与这组数据有关操…

【Oracle 集群】RAC知识图文详细教程(三)--RAC工作原理和相关组件

RAC 工作原理和相关组件 OracleRAC 是多个单实例在配置意义上的扩展&#xff0c;实现由两个或者多个节点&#xff08;实例&#xff09;使用一个共同的共享数据库&#xff08;例如&#xff0c;一个数据库同时安装多个实例并打开&#xff09;。在这种情况下&#xff0c;每一个单独…

什么是ISO21434网络安全中的信息安全?-亚远景

在ISO 21434标准中&#xff0c;信息安全指的是保护汽车网络、汽车电子系统和与汽车相关的信息免受未经授权的访问、修改、破坏、泄露和干扰的能力。信息安全的目标是确保车辆的电子和通信系统在数字化和互联环境中具备足够的防护&#xff0c;以防范潜在的威胁和攻击。 以下是IS…

帮管客CRM SQL注入漏洞

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

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

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

基于单片机的直流伺服电机调速系统设计

摘要:直流伺服电机通常在机器手、自动化生产线等数字控制系统中作为执行驱动机构。本文介绍一种基于单片机的直流伺服电机调速系统。其中C8051F020 单片机作为控制核心,通过数码管显示驱动和键盘扫描控制芯片CH452 接收按键输入和显示输出。C8051F020 单片机内部自带的PCA 计…

如何在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;两…

【PDF.js】发票PDF不显示文本的问题

控制台提示警告&#xff1a; Warning: loadFont - translateFont failed: "UnknownErrorException: The CMap "baseUrl" parameter must be specified, ensure that the "cMapUrl" and "cMapPacked" API parameters are provided.".…

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

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