代码编织梦想

环形链表问题1

给定一个链表,判断链表中是否有环。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。

如果链表中存在环,则返回 true 。 否则,返回 false 。

示例 1:

输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

示例 2:

输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。

示例 3:

输入:head = [1], pos = -1
输出:false
解释:链表中没有环。

提示:

  • 链表中节点的数目范围是 [0, 104]

  • -105 <= Node.val <= 105

  • pos 为 -1 或者链表中的一个 有效索引 。

参考答案

class Solution {
public:
    bool hasCycle(ListNode* head) {
        if (head == nullptr || head->next == 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

给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。

为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。

说明:不允许修改给定的链表。

示例 1:

输入:head = [3,2,0,-4], pos = 1
输出:返回索引为 1 的链表节点
解释:链表中有一个环,其尾部连接到第二个节点。

示例 2:

输入:head = [1,2], pos = 0
输出:返回索引为 0 的链表节点
解释:链表中有一个环,其尾部连接到第一个节点。

示例 3:

输入:head = [1], pos = -1
输出:返回 null
解释:链表中没有环。

提示:

  • 链表中节点的数目范围在范围 [0, 104] 内

  • -105 <= Node.val <= 105

  • pos 的值为 -1 或者链表中的一个有效索引

参考答案

class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        ListNode *slow = head, *fast = head;
        while (fast != nullptr) {
            slow = slow->next;
            if (fast->next == nullptr) {
                return nullptr;
            }
            fast = fast->next->next;
            if (fast == slow) {
                ListNode *ptr = head;
                while (ptr != slow) {
                    ptr = ptr->next;
                    slow = slow->next;
                }
                return ptr;
            }
        }
        return nullptr;
    }
};

回文数问题

你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。

回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。

示例 1:

输入:x = 121
输出:true

示例 2:

输入:x = -121
输出:false
解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。

示例 3:

输入:x = 10
输出:false
解释:从右向左读, 为 01 。因此它不是一个回文数。

示例 4:

输入:x = -101
输出:false

提示:

-231 <= x <= 231- 1

进阶:你能不将整数转为字符串来解决这个问题吗?

参考答案

#include <bits/stdc++.h>

using namespace std;

class Solution {
public:
    bool isPalindrome(int x) {
        if (x == 0) {
            return true;
        }
        if (x < 0) {
            return false;
        }
        return x == reverse(x);
    }

private:
    int reverse(int x) {
        int n = 0;
        while (x != 0) {
            // Checking the over/underflow.
            int r = x % 10;
            if (n > INT_MAX / 10 || (n == INT_MAX / 10 && r > 7)) {
                return 0;
            }
            if (n < INT_MIN / 10 || (n == INT_MIN / 10 && r < -8)) {
                return 0;
            }

            n = n * 10 + r;
            x = x / 10;
        }
        return n;
    }
};

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zy_dreamer/article/details/130866667

2018leetcode算法面试题汇总部分解答-爱代码爱编程

文章目录 开始之前只出现一次的数字求众数搜索二维矩阵2合并两个有序数组鸡蛋掉落 字符串验证回文串有效的字母异位词字符串中的第一个唯一字符反转字符串 数组乘积最大子序列旋转数组存在重复元素移动零两个数组的交集2

Leetcode算法题-链表-爱代码爱编程

19. 删除链表的倒数第N个节点 https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/ public ListNode removeNthFromEnd(ListNode head, int n) {     ListNode dummy = new ListNode(0)

面试题:面试高频出现的 leetcode 算法题集(重中之重)-爱代码爱编程

最新进度请查看:https://github.com/gaoshengnan/LeetCode 以下列出面试高频出现,以及一些非常经典重要的算法题: 实战题目 - Array  题号  难度 题目链接            答案链接            是否完成11中等盛最多水的容器 ❎26简单删除排序数组中重复项remove Duplic

面试刷leetcode算法题整理(基础)-爱代码爱编程

目录 查找  二分 简单二分 二分方式找左边界/右边界 搜索方式找左右边界 在排序数组中查找元素第一个和最后一个位置M  二分  找左边界 右边界  | 或二分之后直接向左右搜索边界 排序 多数元素E  排序后取中间值/hashmap 计数/摩尔投票法(未尝试) 递归 搜索 双指针 左右指针解决数组问题 快慢指针解决链表问题 无重

总结----20个最常见的算法面试问题-爱代码爱编程

在互联网面试的过程中,有一个环节是逃不掉的,就是算法面试。一般,面试官出的面试题都是从题库里抽出来的,很少有自己出新题的(当然,算法笔试过程除外)。所以,只要我们刷题刷的足够多,就总有概率遇到原题。当然,我们也可以押题,毕竟,一些高频率的题目总是有代表性的。 本文列举了20个在计算机面试过程中经常被问到的算法题,排名不分前后,这些题目也只是代表我自己在面

LeetCode-题目详解:链表-爱代码爱编程

2-两数相加 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。 示例 1: 输入:l1 = [2,4,3], l2 = [5,6,4] 输出:[7,0,8] 解释

【随想录6 】环形链表与回文链表总结(带正确性证明)-爱代码爱编程

个人认为链表这部分的算法相对简单,笔试中需要ac,面试需要能说明白为什么这么操作能保证其结果正确性就好了。 链表问题考察的时间复杂度,空间复杂度稍不重要,笔试中为了过怎么都可以,面试一定要聊时间空间都最优的解法, 141. 环形链表 142. 环形链表 II 234. 回文链表 环形链表 141. 环形链表 法一,用set将每个

leetcode算法之--链表系列-爱代码爱编程

点赞收藏,以防遗忘 本文【程序大视界】已收录,关注免费领取互联网大厂学习资料,添加博主好友进群学习交流,欢迎留言和评论,一起交流共同进步。 目录 【一】前言 【二】合并链表 【三】相交链表 【四】反转链表 【五】回文链表 【六】环形链表 【七】总结 【一】前言 2022经济寒冬之下,在年末之际来得更为惨烈,企鹅、宇宙

历年微软面试中出现的leetcode算法题_微软面试leecode-爱代码爱编程

题目源于(2019.04.06~2022.05.07)的牛客面经,每一题目的出处都有原始牛客、力扣链接对应关系。 题目 出  现 次 数 链接 215. 数组中的第K个最大 元素 6 n-an-array 124. 二叉树中的最大路径 和 4 m-path-sum 468. 验证IP地址 3 力扣 236. 二叉树的

链表oj2——倒数第k个结点-爱代码爱编程

文章目录 @[toc] ✨单链表查找中间结点🥝两次遍历链表法🥝快慢指针法 ✨查找链表中倒数第K个结点✨合并两个升序链表🥝归并排序合并链表 ✨分割链表🥝双哨兵链表

算法18:leetcode_链表相关算法题_java 将单项链表按某值-爱代码爱编程

链表无小事,只要是涉及到链表的算法题,边界值的设定尤为重要,而且及其容易出错误。这就要求我们平时多加练习。但是,我们在面试和笔试的过程中往往会碰到链表相关的题目,所以我们在笔试的时候一般都会借助系统提供的工具类进行解答,但是在面试的过程中,面试官往往想听到的答案是和链表直接相关的解答。这就要求我们有2套不同的应答方案。 题目1:给定一个单链表的头节点