您的位置:首页 > 科技 > IT业 > 网络建站如何建成_搭建网站的企业_互联网营销案例分析_2023免费推广入口

网络建站如何建成_搭建网站的企业_互联网营销案例分析_2023免费推广入口

2024/10/5 16:23:02 来源:https://blog.csdn.net/sgbscx/article/details/142419228  浏览:    关键词:网络建站如何建成_搭建网站的企业_互联网营销案例分析_2023免费推广入口
网络建站如何建成_搭建网站的企业_互联网营销案例分析_2023免费推广入口

环形链表问题——力扣141,142

  • 141.判断链表是否带环
  • 142.给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 NULL

141.判断链表是否带环

在这里插入图片描述

  1. 这道题不能用比较链表中的值来判断是否带环,因为链表中不同节点的值可以相同,我们要比较地址来判断是否带环
  2. 带环问题我们要用快慢指针来解决。让慢的指针一次走一步,快的指针一次走两步。这样如果链表中带环的话,慢指针一定会与快指针相遇。
  3. 地址相同就是相遇,说明链表带环

把带环的链表想象成这个样子
在这里插入图片描述

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

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

在这里插入图片描述

这道题我们要找到他的入环点。
在这里插入图片描述

1.假设快指针fast在与慢指针slow第一次相遇时 fast只在环内多跑了一圈 (b+c)
那么在相遇点相遇时,slow跑了 a+b,fast跑了a+(b+c)+b。
又因为快指针一次走两步,慢指针一次走一步所以有:2(a+b)=a+2b+c
所以推出 a = c
所以我们相遇后只需要再定义一个指针 cur 从头节点位置开始走,slow从相遇点开始走,他们两相遇时就是链表中环的起始点

2.fast也可能在环内跑了很多圈才与slow相遇
但slow走的路程永远a+b
在这里插入图片描述
fast在环内走了很多圈后与slow相遇
在这里插入图片描述
fast走的时slow的二倍在这里插入图片描述
同时去掉b在这里插入图片描述>同时减去一个a在这里插入图片描述

所以得处结论,我们可以用cur 指向头节点,让慢指针在环内与cur同时走最终还是会在入环点相遇,返回相遇点即可

struct ListNode *detectCycle(struct ListNode *head) {struct ListNode *fast = head;struct ListNode *slow = head;while(fast && fast->next){fast = fast->next->next;slow = slow->next;if(fast == slow){struct ListNode *cur = head;while(1){if(cur == slow){return slow;}cur = cur->next;slow = slow->next;}}}return NULL;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com