LeetCode 热题 100 | 链表(上)

这篇具有很好参考价值的文章主要介绍了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. 相交链表

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

LeetCode 热题 100 | 链表(上),力扣,leetcode,链表

解题思路:

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

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

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

LeetCode 热题 100 | 链表(上),力扣,leetcode,链表

即 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 指针全部反向即可。

思路说明图:

LeetCode 热题 100 | 链表(上),力扣,leetcode,链表

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

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. 回文链表

解题思路:文章来源地址https://www.toymoban.com/news/detail-827481.html

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

到了这里,关于LeetCode 热题 100 | 链表(上)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【LeetCode热题100】【链表】两两交换链表中的节点

    题目链接:24. 两两交换链表中的节点 - 力扣(LeetCode) 实际上是两个两个一组颠倒顺序,可以用k=2使用【LeetCode热题100】【链表】K 个一组翻转链表-CSDN博客 但可以更简单,就先看两个,先取第二个的指针,递归颠倒第二个后面的节点,链接到第一个节点上,然后把第一个节

    2024年04月13日
    浏览(29)
  • 【LeetCode热题100】打卡第33天:环形链表&LRU缓存

    大家好,我是知识汲取者,欢迎来到我的LeetCode热题100刷题专栏! 精选 100 道力扣(LeetCode)上最热门的题目,适合初识算法与数据结构的新手和想要在短时间内高效提升的人,熟练掌握这 100 道题,你就已经具备了在代码世界通行的基本能力。在此专栏中,我们将会涵盖各种

    2024年02月15日
    浏览(32)
  • LeetCode 热题 100(五):54. 螺旋矩阵、234. 回文链表、21. 合并两个有序链表

    54. 螺旋矩阵 https://leetcode.cn/problems/spiral-matrix/ 题目要求:  思路:一定要 先找好边界 。如下图 ,上边界是1234,右边界是8、12,下边界是9、10、11,左边界是5,所以可以确定四个边界所包含的值。然后再 循环一层一层往里进入 ,比如添加完上边界1234后,上边界就需要+1,

    2024年02月12日
    浏览(35)
  • 每日两题 / 142. 环形链表 II & 146. LRU 缓存(LeetCode热题100)

    142. 环形链表 II - 力扣(LeetCode) 用哈希记录走过的节点即可 146. LRU 缓存 - 力扣(LeetCode) O ( 1 ) O(1) O ( 1 ) 地查找并修改kv结构,用unordered_map即可解决 问题是题目要求:哈希表容量有限,超出容量时,将删除最久未访问的kv 那么关键就在于:如何用数据结构表示访问的先后顺

    2024年04月16日
    浏览(29)
  • LeetCode 热题 100(四):48. 旋转图像、240. 搜索二维矩阵 II、234. 回文链表

    题目要求:就是一个顺时针的旋转过程。  思路:观察矩阵,得出翻转前第i行的第J个元素  等于  翻转后倒数第i列的第J个元素,举例说明,第1行第2个元素为“2”,翻转后到了 倒数第1列的第2个元素。说白了只需要针对翻转前的第i行和翻转后的倒数第i列 代码: 题目要求

    2024年02月11日
    浏览(24)
  • LeetCode 热题 100(七):105. 从前序与中序遍历序列构造二叉树、14. 二叉树展开为链表

    105. 从前序与中序遍历序列构造二叉树 https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-traversal/ 思路:依据前序遍历的根左右和中序遍历的左根右, 且根左长度=左根 代码: 14. 二叉树展开为链表 https://leetcode.cn/problems/flatten-binary-tree-to-linked-list/ 思路:前序遍历

    2024年02月10日
    浏览(36)
  • 记录力扣热题-100——从链表中找到刷题感觉

    狮子此前已经很久没有碰过算法题了,对于之前好不容易攒起来的题感又没了…最近准备面试,又得重新将其捡起来。算法题是一种很奇妙的东西,如果刚开始刷很难找得到感觉,总得一步一步慢慢来,心急吃不到热豆腐,狮子建议如果刚开始刷题,先从简单的链表题开始刷

    2024年02月12日
    浏览(29)
  • LeetCode热题 100整理

    35. 搜索插入位置 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums = [1,3,5,6], target = 5 输出: 2 示例 2: 输入: nums = [1,3,5,6], target

    2024年02月13日
    浏览(29)
  • 螺旋矩阵 LeetCode热题100

    给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 模拟,朝一个方向走,走过的点标记一下,直到碰到边界或碰到已经走过的路,换个方向。右-下,下-左,左-上,上-右。直到走完所有点。

    2024年02月14日
    浏览(29)
  • LeetCode 热题100——单调栈

    ​   个人主页: 日刷百题 系列专栏 : 〖C语言小游戏〗 〖Linux〗 〖数据结构〗   〖C语言〗 🌎 欢迎各位 → 点赞 👍+ 收藏 ⭐️+ 留言 📝  ​ ​ 递增单调栈:栈中元素从栈底到栈顶依次增大 递减单调栈:栈中元素从栈底到栈顶依次减小 在学习完朴素的数据结构栈之后,

    2024年02月04日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包