当前位置: 首页 > news >正文

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;}
};

相关文章:

  • 解决Docker AList本地挂载失效的问题。
  • 免费电视TV盒子软件,好用的免费电视盒子软件大全,免费电视盒子APP大全,2024最新整理
  • 影院购票|电影院订票选座小程序|基于微信小程序的电影院购票系统设计与实现(源码+数据库+文档)
  • npm 以组织为单位发布依赖包(@username/package-name、@org-name/package-name)
  • 【全网最全】2024美赛ABCDEF题思路模型全解(后续会更新)
  • go语言标准库flag命令行参数解析
  • HDFS Federation前世今生
  • ChatGPT炸裂了
  • Mac安装及配置MySql及图形化工具MySQLworkbench安装
  • 贪吃蛇/链表实现(C/C++)
  • Django_基本增删改查
  • Leetcode—2950. 可整除子串的数量【中等】Plus(前缀和题型)
  • 面试经典 150 题 -- 滑动窗口 (总结)
  • 异步解耦之RabbitMQ(四)_消息持久化及ACK机制
  • 【android】对于google-webrtc的性能中, memory leak
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • Angular 响应式表单 基础例子
  • golang中接口赋值与方法集
  • JavaScript的使用你知道几种?(上)
  • JDK9: 集成 Jshell 和 Maven 项目.
  • Koa2 之文件上传下载
  • Laravel Mix运行时关于es2015报错解决方案
  • MySQL用户中的%到底包不包括localhost?
  • PermissionScope Swift4 兼容问题
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • python学习笔记 - ThreadLocal
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • SSH 免密登录
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • 阿里云购买磁盘后挂载
  • 聚类分析——Kmeans
  • 力扣(LeetCode)56
  • 码农张的Bug人生 - 初来乍到
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 每天一个设计模式之命令模式
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 前端代码风格自动化系列(二)之Commitlint
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 使用 Docker 部署 Spring Boot项目
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 正则表达式小结
  • 你对linux中grep命令知道多少?
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • Prometheus VS InfluxDB
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (Matlab)使用竞争神经网络实现数据聚类
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (算法)N皇后问题
  • (转)程序员疫苗:代码注入
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • .gitignore文件---让git自动忽略指定文件
  • .NET Compact Framework 多线程环境下的UI异步刷新