目录

11. 日常算法

1. 141. 环形链表

题目来源

给你一个链表的头节点 head ,判断链表中是否有环。

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

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

c 复制代码
class Solution {
public:
    bool hasCycle(ListNode *head) {
        if (head == nullptr) return false;
        ListNode* low = head, *fast = head;
        while (fast && fast->next){
            low = low->next;
            fast = fast->next->next;
            if (low == fast) return true;
        }
        return false;
    }
};

2. 二叉树的最近公共祖先

题目来源

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:"对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。"

方法一:使用栈

c 复制代码
class Solution {
public:
    bool treePath(TreeNode* root, stack<TreeNode*> &st, TreeNode* target){
        if (root == nullptr) return false;
        st.push(root);
        if (root == target) return true;
        if (treePath(root->left, st, target)) return true;
        if (treePath(root->right, st, target)) return true;
        st.pop();
        return false;
    }

    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        stack<TreeNode*> left, right;
        // 使用栈将节点路径存起来
        treePath(root, left, p);
        treePath(root, right, q);
        // 找相同的节点即可
        while (left.top() != right.top()){
            if (left.size() > right.size()) left.pop();
            else right.pop();
        }
        return left.top();
    }
};

方法二:递归

c 复制代码
class Solution {
public:
    TreeNode* ret;
    bool treePath(TreeNode* root, TreeNode* p, TreeNode* q)
    {   
        if (root == nullptr) return false;
        bool lson = treePath(root->left, p, q);
        bool rson = treePath(root->right, p, q);
        if ((lson && rson) || ((root->val == p->val || root->val == q->val) && (lson || rson)))
            ret = root;
        return lson || rson || (root->val == p->val || root->val == q->val);
    }
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        treePath(root, p, q);
        return ret;
    }
};
本文是转载文章,点击查看原文
如有侵权,请联系 xyy@jishuzhan.net 删除
相关推荐
曦月逸霜8 分钟前
第十四届蓝桥杯省赛真题解析(含C++详细源码)
c++·算法·蓝桥杯
KNeeg_1 小时前
⭐十大排序算法
java·算法·排序算法
KangkangLoveNLP1 小时前
手动实现一个迷你Llama:手动实现Llama模型
网络·人工智能·python·算法·机器学习·自然语言处理·llama
烁3471 小时前
每日一题(小白)回溯篇4
java·开发语言·算法
独好紫罗兰2 小时前
洛谷题单3-P5724 【深基4.习5】求极差 最大跨度值 最大值和最小值的差-python-流程图重构
开发语言·python·算法
风清扬雨2 小时前
计算机视觉中的基于网格的卷绕算法全解析
人工智能·算法·计算机视觉
对方正在长头发丿2 小时前
棋盘问题(DFS)
数据结构·c++·算法·蓝桥杯·深度优先
@蓝莓果粒茶2 小时前
LeetCode第132题_分割回文串II
开发语言·算法·leetcode·职场和发展·c#·.net·linq
云闲不收3 小时前
垃圾回收——三色标记法(golang使用)
jvm·算法·golang
菜鸟江多多3 小时前
32x32热成像高斯滤波图像处理
图像处理·单片机·算法