刷爆leetcode第三期

简介: 刷爆leetcode第三期

题目一  环形链路

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


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


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

还是先上图

我们先来看有环的情况

这个时候实际上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 不作为参数进行传递,仅仅是为了标识链表的实际情况。

不允许修改 链表。

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

我们又要证明一个结论

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

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


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

目录
相关文章
|
JavaScript 前端开发 索引
经典面试题数组常用的方法
### 1.数组常用方法之 push()(==改变原数组,产生新数组==) - `push` 是用来在数组的末尾追加一个元素,返回添加以后的长度 ```javascript var arr = [1, 2, 3] // 使用 push 方法追加一个元素在末尾 arr.push(4) console.log(arr) // [1, 2, 3, 4] var res = arr.push(1,2,3,34); res//8 ``` ### 2.数组常用方法之 pop()(==改变原数组,产生新数组==) - `po
413 127
|
存储 API 云计算
SaaS与OpenStack的区别
【8月更文挑战第5天】
283 7
|
机器学习/深度学习 人工智能 算法
人工智能的基础
人工智能的基础
605 2
|
存储 SQL 关系型数据库
MySQL 中的存储过程-2
MySQL 中的存储过程
138 0
|
API 数据安全/隐私保护 容器
Zookeeper使用介绍与集群搭建实战
Zookeeper使用介绍与集群搭建 作者主页:https://www.couragesteak.com/
Zookeeper使用介绍与集群搭建实战
|
机器学习/深度学习 Unix Shell
shell脚本的使用该熟练起来了,你说呢?(篇二)
shell脚本的使用该熟练起来了,你说呢?(篇二)
253 3
shell脚本的使用该熟练起来了,你说呢?(篇二)
|
JSON 前端开发 JavaScript
必知必会的axios学习经(更新中)
必知必会的axios学习经(更新中)
276 0
|
存储 Ubuntu 数据管理
Docker镜像的原理
centos7系统 包括2部分, linux内核,作用是提供操作系统的基本功能,和机器硬件交互,如何读取磁盘数据,管理网络,使用C编写的,由linus的开发团队,内核只提供操作系统的基本功能和特性,如内存管理、进程调度、文件管理等等。 系统发行版,作用是提供软件功能,例如centos发行版,ubuntu发行版,suse发行版。centos发行版,yum安装包管理;ubuntu发行版。
350 0
|
前端开发 小程序 UED
小程序图片合成:异步并发渲染→同步阻塞渲染
小程序图片合成:异步并发渲染→同步阻塞渲染
小程序图片合成:异步并发渲染→同步阻塞渲染
|
数据库
LeetCode(数据库)- 查询回答率最高的问题
LeetCode(数据库)- 查询回答率最高的问题
176 0