刷爆leetcode第三期

题目一  环形链路

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

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

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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/linked-list-cycle

还是先上图

我们先来看有环的情况

这个时候实际上fast和slow会在里面陷入死循环

我们把这个图再抽象下

 

实际上就是一个这样子的图形

大家有没有表示眼熟?

这不就是我们的操场吗

那么我们把问题变一下

两个人跑步 一个跑的比较快 一个跑的比较慢

如果在一个直线的操场上它们会相遇嘛?

显然不会

但是如果在一个环形的操场上呢?

那必然会啊

那么我们接着来看

我们证明这两个问题后,环的问题就很简单了,直接上手写代码

* struct ListNode {
    *int val;
    *struct ListNode* next;
    *
};
*/
bool hasCycle(struct ListNode* head) {
    struct ListNode* slow, * fast;
    slow = fast = head;
    while (fast && fast->next)
    {
        slow = slow->next;
        fast = fast->next->next;
        if (slow == fast)
        {
            return true;
        }
    }
    return false;
}

 题目二  环形链表二

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

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

不允许修改 链表。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/linked-list-cycle-ii

这一题跟上一题一样但又不一样

我们又要证明一个结论

我们按照这个结论写代码会非常简单

* struct ListNode {
    *int val;
    *struct ListNode* next;
    *
};
*/
struct ListNode* detectCycle(struct ListNode* head) {
    struct ListNode* slow, * fast;
    slow = fast = head;
    while (fast && fast->next)
    {
        slow = slow->next;
        fast = fast->next->next;
        if (slow == fast)
        {
            struct ListNode* meet = slow;
            struct ListNode* start = head;
            while (meet != start)
            {
                start = start->next;
                meet = meet->next;
            }
            return meet;
        }
    }
    return NULL;
}

还有一种不用结论的方法,找入口问题转换成找链表交点问题 

* struct ListNode {
    *int val;
    *struct ListNode* next;
    *
};
*/
struct ListNode* getIntersectionNode(struct ListNode* headA, struct ListNode* headB) {
    struct ListNode* tailA = headA, * tailB = headB;
    int lenA = 1;
    int lenB = 1;
    //计算链表A的长度
    while (tailA->next)
    {
        tailA = tailA->next;
        ++lenA;
    }
    while (tailB->next)//B的长度
    {
        tailB = tailB->next;
        ++lenB;
    }
    int gap = abs(lenA - lenB);//长度差的绝对值
    struct ListNode* longlist = headA, * shortlist = headB;
    if (lenA < lenB)//判断谁长谁短
    {
        longlist = headB;
        shortlist = headA;
    }
    //长的先走差距步
    while (gap--)
    {
        longlist = longlist->next;
    }
    //同时走
    while (longlist != shortlist)
    {
        longlist = longlist->next;
        shortlist = shortlist->next;
    }
    return longlist;

}
struct ListNode* detectCycle(struct ListNode* head) {
    struct ListNode* slow, * fast;
    slow = fast = head;
    while (fast && fast->next)
    {
        slow = slow->next;
        fast = fast->next->next;
        if (fast == slow)
        {
            struct ListNode* meet = slow;
            struct ListNode* lit1 = head;
            struct ListNode* lit2 = meet->next;
            meet->next = NULL;
            return getIntersectionNode(lit1, lit2);
        }
    }
    return NULL;
}

 以上便是本文所有内容了,如有错误请各位大佬不吝赐教,感谢留言

在 PyCharm 中使用 LeetCode 插件进行题是一个高效的方式,尤其适合已经熟悉 PyCharm 开发环境的开发者。以下是详细的使用和配置步骤: ### 安装 LeetCode 插件 1. 打开 PyCharm,依次点击 `File` → `Settings` → `Plugins`。 2. 在插件市场(Marketplace)中搜索 `leetcode`。 3. 找到名为 **LeetCode Editor** 的插件,点击 `Install` 进行安装。 4. 安装过程中会提示接受许可协议,点击 `Accept` 继续。 5. 安装完成后,重启 PyCharm 以使插件生效。 ### 配置 LeetCode 插件 1. 重启 PyCharm 后,在右侧工具栏中找到 **LeetCode** 面板。 2. 点击面板中的 **Sign In**,输入你的 LeetCode 账号和密码进行登录。 3. 登录成功后,LeetCode 面板会显示题目列表,支持按照标签、难度等分类筛选题目。 4. 双击某道题目,即可在编辑器中打开该题目的模板代码。题目描述会显示在代码上方的注释中,与网页版类似,但不包含图示。 ### 编写与调试代码 1. 插件提供的代码模板中通常只包含函数体,没有完整的输入输出逻辑。 2. 可以直接在插件提供的文件中编写代码,但为了更好的调试体验,建议将函数体复制到自己的工程文件中进行开发和测试。 3. 编写完成后,可以使用插件中的运行功能测试代码逻辑,插件会自动调用 LeetCode 的测试用例并返回结果[^3]。 ### 常见注意事项 - LeetCode 插件中编写的代码不需要包含 `main()` 函数或完整的输入输出处理,只需实现题目要求的函数即可。 - 如果使用 C++,注意 `sort` 函数的第三个参数 `cmp` 必须声明为 `static`,否则会导致编译错误。 - 对于涉及容器(如 `vector`)的问题,若不在类内使用,建议在函数内部进行初始化,避免全局变量带来的副作用。 - 若遇到 `AddressSanitizer: DEADLYSIGNAL` 错误,通常是因为访问了非法内存地址,检查数组越界或指针操作是否正确[^2]。 ### 示例代码模板 以下是一个 LeetCode 插件中常见的代码模板示例: ```python class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]: # 在此处编写你的解法 pass ``` 在编写完成后,可以直接在插件中点击运行按钮进行测试,或者将代码复制到本地项目中进行调试。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值