LeetCode 热题 100 | 链表(上)

目录

1  基础知识

1.1  空指针

1.2  结构体

1.3  指针访问

1.4  三目运算符

2  160. 相交链表

3  206. 反转链表

4  234. 回文链表


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

1  基础知识

1.1  空指针

使用 nullptr 来判断是否为空指针:

if (headA == nullptr)

“NULL 在 C++ 中就是 0,这是因为在 C++ 中 void* 类型是不允许隐式转换成其他类型的,所以之前 C++ 中用 0 来代表空指针,但是在重载整型的情况下,会出现上述的问题。所以,C++11 加入了 nullptr,可以保证在任何情况下都代表空指针,而不会出现上述的情况,因此,建议以后还是都用 nullptr 替代 NULL 吧,而 NULL 就当做 0 使用。”

摘自博客:C++ 中 NULL 和 nullptr 的区别

1.2  结构体
struct ListNode {int val;ListNode *next;ListNode(int x) : val(x), next(NULL) {}
};
  • val 和 next 都是结构体 ListNode 中的元素
  • val 表示当前链表节点的值
  • next 表示指向下一个链表节点的指针
  • ListNode(int x) : val(x), next(NULL) {} 是初始化方法

1.3  指针访问
ListNode * p;p->val;  // 访问值
p->next;  // 访问下一节点指针

1.4  三目运算符
pA = pA == nullptr ? headB : pA->next;

其中,“?” 前的是判断条件,“?” 后的是两个选项,“:” 前的是条件成立时选择的选项,“:” 后的是条件不成立时选择的选项。这里的 “pA == nullptr” 是判断条件,“headB” 是 “pA == nullptr” 成立时 “pA” 等于的值,“pA->next” 是 “pA == nullptr” 不成立时 “pA” 等于的值。

三目运算符不是为了装逼用的,真的可以在很多情况下简化判断结构。

2  160. 相交链表

妈呀,这是我大一下程算课期末的真题

解题思路:

假设蓝色段的长度为 a,绿色段的长度为 b,黄色段的长度为 c 。定义 pA 和 pB 两个指针,pA 遍历完 a + c 后遍历 b,pB 遍历完 b + c 后遍历 a,判断:

  • 若 pA 和 pB 相遇且节点不为空,则表明两条链表相交
  • 若 pA 和 pB 未相遇或节点为空,则表明两条链表不相交

这种解法用到了一点数学思想:

a+b+c

即 pA 和 pB 最终都会到达同一位置,它们在该位置指向的节点是否一致决定了链表是否相交。

如有疑问请参考官方题解,它的分情况讨论更加详细。

class Solution {
public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {if (headA == nullptr || headB == nullptr) {return nullptr;}ListNode * pA = headA, * pB = headB;while (pA != pB) {pA = pA == nullptr ? headB : pA->next;pB = pB == nullptr ? headA : pB->next;}return pA;}
};

3  206. 反转链表

解题思路:把所有节点的 next 指针全部反向即可。

思路说明图:

对于这种反转问题,核心思想就是把已经遍历过的、但还需要用到的位置保存下来。

class Solution {
public:ListNode* reverseList(ListNode* head) {ListNode * prev = nullptr;ListNode * curr = head;while (curr) {ListNode * next = curr->next;curr->next = prev;prev = curr;curr = next;} return prev;}
};

4  234. 回文链表

解题思路:

  1. 遍历链表,把所有 val 存入一个数组中
  2. 遍历数组的前半段,判断里面的 val 是否和后半段的 val 对称
class Solution {
public:bool isPalindrome(ListNode* head) {ListNode * p = head;vector<int> vals;while (p) {vals.push_back(p->val);p = p->next;}for (int i = 0; i < vals.size() / 2 + 1; ++i) {if (vals[i] != vals[vals.size() - i - 1]) return false;}return true;}
};

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

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

相关文章

模拟钉钉官网动画

实现思路&#xff1a;利用粘性定位sticky&#xff0c;以及滚动事件实现。首先我们应该设置滚动动画开始位置和结束位置 &#xff0c;然后根据位置计算透明度或者transform&#xff0c;scale的值。 首先根据上述图线计算属性值&#xff0c;代码如下&#xff1a; function creat…

Go语言在构建HTTP代理时的优势和挑战

Go语言&#xff0c;又称Golang&#xff0c;是一种开源的、静态类型的、编译型的编程语言。它在设计时考虑到了性能、并发性和简洁性&#xff0c;因此在构建网络应用方面表现优异。特别是在构建HTTP代理时&#xff0c;Go语言展现出了一些独特的优势&#xff0c;但也存在一些挑战…

鸿蒙开发-UI-页面路由

鸿蒙开发-UI-组件 鸿蒙开发-UI-组件2 鸿蒙开发-UI-组件3 鸿蒙开发-UI-气泡/菜单 文章目录 一、基本概念 二、页面跳转 1.router基本概念 2.使用场景 3.页面跳转参数传递 三、页面返回 1.普通页面返回 2.页面返回前增加一个询问框 1.系统默认询问框 2.自定义询问框 总…

Linux基础知识合集

整理了一下学习的一些关于Linux的一些基础知识&#xff0c;同学们也可以通过公众号菜单栏查看&#xff01; 一、基础知识 Linux基础知识 Linux命令行基础学习 Linux用户与组概念初识 Linux文件与目录权限基础 Linux中文件内容的查看 Linux系统之计划任务管理 二、服务器管理 Vm…

BFS——多源BFS+双端队列BFS

173. 矩阵距离&#xff08;173. 矩阵距离 - AcWing题库&#xff09; 思路&#xff1a;这题和多源最短路还是有一些区别的&#xff0c;相当于求一个点到距离它最近的一个终点的距离&#xff0c;其实我们可以反着来看&#xff0c;将终点视为起点&#xff0c;然后加一个虚拟起点&a…

降维(Dimensionality Reduction)

一、动机一&#xff1a;数据压缩 这节我将开始谈论第二种类型的无监督学习问题&#xff0c;称为降维。有几个原因使我们可能想要做降维&#xff0c;其一是数据压缩&#xff0c;它不仅允许我们压缩数据使用较少的计算机内存或磁盘空间&#xff0c;而且它可以加快我们的学习算法。…

Android Studio非UI线程修改控件——定时器软件

目录 一、UI界面设计 1、UI样式 2、XML代码 二、功能编写 1、定义 2、实现方法 3、功能实现 一、UI界面设计 1、UI样式 2、XML代码 <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android…

vue实现带缩略图的轮播图(vue-awesome-swiper)

demo 请复制打开 https://download.lllomh.com/cliect/#/product/E125504451206525 如点击链接跳转失败请复制网址到浏览器打开 1.引入swiper和vue-awesome-swiper插件 npm install swiper4 --save npm install vue-awesome-swiper3 --save2.在main.js中引入&#xff1a; …

【代码随想录20】669.修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树

目录 669.修剪二叉搜索树题目描述参考代码 108.将有序数组转换为二叉搜索树题目介绍参考代码 538.把二叉搜索树转换为累加树题目描述参考代码 669.修剪二叉搜索树 题目描述 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树…

XGB-1:XGBoost安装及快速上手

XGBoost是“Extreme Gradient Boosting”的缩写&#xff0c;是一种高效的机器学习算法&#xff0c;用于分类、回归和排序问题。它由陈天奇&#xff08;Tianqi Chen&#xff09;在2014年首次提出&#xff0c;并迅速在数据科学竞赛和工业界获得广泛应用。XGBoost基于梯度提升框架…

【Git】01 Git介绍与安装

文章目录 一、版本控制系统二、Git三、Windows安装Git3.1 下载Git3.2 安装3.3 检查 四、Linux安装Git4.1 YUM安装4.2 源码安装 五、配置Git5.1 配置用户名和邮箱5.2 配置级别5.3 查看配置 六、总结 一、版本控制系统 版本控制系统&#xff0c;Version Control System&#xff…

Unity中AssetBundle的打包和分包策略

在Unity中&#xff0c;AssetBundle的打包策略主要是针对资源的整理和分组&#xff0c;以做到即方便管理&#xff0c;又能有效优化资源的加载和内存使用。具体来看包括以下几种常见的策略&#xff1a; 打包资源的预处理&#xff1a;为了减小AssetBundle的大小和数量&#xff0c;…