当前位置: 首页 > wzjs >正文

青岛网站建设方案书竞价推广返点开户

青岛网站建设方案书,竞价推广返点开户,WordPress添加live2d,网站与域名题目 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部…

题目

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

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 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
解释:链表中没有环。

分析

哈希表法

遍历链表中的每个节点并记录下来。一旦遇到了此前遍历过的节点,就可以判定链表中存在环,直接返回该节点。

时间复杂度:O(n),n为链表中节点的数目

空间复杂度:O(n)

class Solution {
public:ListNode *detectCycle(ListNode *head) {// 使用哈希集合来存储已经访问过的节点std::unordered_set<ListNode*> visited;// 遍历链表while (head != nullptr) {// 检查当前节点是否已经在哈希集合中if (visited.count(head)) {// 如果存在,说明找到了环的入口节点,返回该节点return head;}// 将当前节点插入到哈希集合中visited.insert(head);// 移动到下一个节点head = head->next;}// 如果遍历完整个链表都没有找到环,返回 nullptrreturn nullptr;}
};

快慢指针法

判断是否有环:首先使用快慢指针判断链表中是否存在环。slow 指针每次移动一步,fast 指针每次移动两步,如果它们相遇,则说明链表中存在环。

寻找环的入口:当快慢指针相遇后,将 slow 指针重新指向链表头节点,然后 slow 和 fast 指针以相同的速度(每次移动一步)继续移动,它们再次相遇的节点就是环的入口节点。

数学推导

设链表的头节点为 head,链表中环的入口节点为 entry,从链表头到环入口的节点数为 a,从环入口到快慢指针相遇点的节点数为 b,从快慢指针相遇点再到环入口的节点数为 c,则环的长度为 b + c

慢指针 slow 每次移动一步,快指针 fast 每次移动两步。当快慢指针相遇时,假设慢指针移动了 a + b 步,快指针移动了 y 步。因为快指针速度是慢指针的两倍,所以 y = 2(a+b)

又因为快指针比慢指针多走了若干圈环,设快指针在环里走了 n 圈(n 为正整数),则有 y = a + n(b + c) + b。将 y = 2(a+b) 代入 y = a + n(b + c) + b 可得:a = c + (n - 1)(b + c)

于是从相遇点到入环点的距离加上 n−1 圈的环长,恰好等于从链表头部到入环点的距离。即当 slow 和 fast 再次相遇时,相遇的节点就是环的入口节点

时间复杂度:O(n),n为链表中节点的数目

空间复杂度:O(1)

class Solution {
public:ListNode *detectCycle(ListNode *head) {// 如果链表为空或者只有一个节点,肯定不存在环,返回 nullptrif (head == nullptr || head->next == nullptr) {return nullptr;}// 定义快慢指针ListNode* slow = head;ListNode* fast = head;// 标记是否有环bool hasCycle = false;// 移动快慢指针,快指针每次移动两步,慢指针每次移动一步while (fast != nullptr && fast->next != nullptr) {slow = slow->next;fast = fast->next->next;// 如果快慢指针相遇,说明存在环if (slow == fast) {hasCycle = true;break;}}// 如果没有环,返回 nullptrif (!hasCycle) {return nullptr;}// 让慢指针回到头节点slow = head;// 快慢指针以相同速度移动,再次相遇的节点就是环的入口节点while (slow != fast) {slow = slow->next;fast = fast->next;}return slow;}
};
http://www.dtcms.com/wzjs/34147.html

相关文章:

  • 惠州做百度网站多少百度app下载安装官方免费版
  • 网站前台维护win7一键优化工具
  • 网站建设应该注意哪些百度热门搜索排行榜
  • 东方购物全部商品粤语seo是什么意思
  • 宁波免费做网站域名注册费用
  • 济宁建设工程信息网站电商数据统计网站
  • 怎样建自己的网站赚钱宁德seo推广
  • 南宁市网站建设哪家好站长统计app下载
  • 学院的网站建设的意义杭州seo网络公司
  • 青岛建网站长春网站建设设计
  • 网上做医生哪个网站好互动营销是什么意思
  • wordpress register_nav_menusseo竞价排名
  • dedecms 网站日志手机做网页的软件
  • 上海新闻网首页北京aso优化
  • 垃圾ip段做网站免费的发帖收录网站
  • 天津河北做网站的公司郑州网络推广培训
  • 大型网站都怎么做推广营销型网站的特点
  • 膳食管理东莞网站建设技术支持seo提升排名技巧
  • 网站设计项目明细啥是网络推广
  • 怎么做微商网站厦门网络推广
  • 太原网站建设费用单页网站seo如何优化
  • 手机网站有免费做的吗企业网络营销的模式有哪些
  • 宿州做网站的公司有哪些怎样做推广营销
  • 东莞网站设计品牌国际新闻界官网
  • wordpress如何导入模板数据上海知名的seo推广咨询
  • 深圳福田做网站刷粉网站推广免费
  • 专业集团网站建设html网页制作软件有哪些
  • 嘉兴网站开发公司电话新品推广活动方案
  • 平面设计范文企业网站优化技巧
  • WordPress 发布内容河南网站建设优化技术