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

数据结构与算法[LeetCode]—Linked List Cycle 确定单链表是否有环,并找出第一个环结点

Linked List Cycle

Given a linked list, determine if it has a cycle in it.

Follow up:
Can you solve it without using extra space?

解决思路:

使用快慢指针,一个步长为2,一个步长为1,如果快指针遇到NULL,则链表没有环。如果两指针相遇,则必定有环。

快指针小心移动时,注意判断合法性。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    bool hasCycle(ListNode *head) {
        // IMPORTANT: Please reset any member data you declared, as
        // the same Solution instance will be reused for each test case.
         ListNode *p1,*p2;
        p1=p2=head;
        while(p1!=NULL && p1->next!=NULL &&p1->next->next!=NULL)  //循环停止说明无环
            {
                p1=p1->next->next;  //每次跳两步
                p2=p2->next;       //每次跳一步
                if(p1==p2)return true;   //说明有环
            }
        return false;
    }
};

Linked List Cycle II

Given a linked list, return the node where the cycle begins. If there is no cycle, return null.

Follow up:
Can you solve it without using extra space?

解决思路:

                       

假设该节点在x位置处,假设步长为1的指针和步长为2的指针相遇在x+z处(C处),循环长度为y,
那么2(x+z)-(x+z)=k*y,则x=k*y-z,(k为>=1常数,表示绕K圈后)那么当一个指针再从开始处(A处)后移时,
另一个指针从相遇点(x+z)处(C处)开始后移时,此时两者速度相同,这两个指针就会在循环开始触相遇。

 

class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        // IMPORTANT: Please reset any member data you declared, as
        // the same Solution instance will be reused for each test case.
        ListNode *p1,*p2;
        p1=p2=head;

        //首先用快慢指针,判断是否有环,并记录相遇处的位置
        while(1){
            if(p1==NULL || p1->next==NULL ||p1->next->next==NULL) return NULL;   //没有环
            p1=p1->next->next;
            p2=p2->next;
            if(p1==p2)break;  //找到了相遇的位置x+z
        }
        
        //一个指针从起点开始,一个指针从x+z处开始,第一次相遇的地方,此时两者速度相同
        p2=head;
        while(1){
            if(p1==p2)return p2;                //此处为环第一个结点处
            p1=p1->next;
            p2=p2->next;
        }
        
    }
};


   

相关文章:

  • 啊,目标!
  • 数据结构与算法[LeetCode]—数组中出现次数异与其他数的一个数
  • Linux 的DNS 的配置...
  • 我与网管师职业认证的钦定缘分
  • linux下显示网卡设备及驱动信息intel shell脚本
  • 数据结构与算法[LeetCode]—两个有序数组合并及找中点问题
  • 无法在web服务器上启动调试, Server Application Error......错误解决方法
  • 数据结构与算法[LeetCode]——sqrt(x)
  • RedHat 9 Linux SendMail 的配置
  • KMP算法深度解析
  • VS2005中Nebula3数据类型的调试信息显示
  • Extjs的ajax同步请求时post方式参数发送方式
  • 史上最“牛”的大型交换机配置图书
  • 数据结构与算法[LeetCode]—Maximum Subarray
  • 盘点2009互联网十大最佳雇主
  • 网络传输文件的问题
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 2017前端实习生面试总结
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • CAP理论的例子讲解
  • Codepen 每日精选(2018-3-25)
  • es6(二):字符串的扩展
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • Java,console输出实时的转向GUI textbox
  • jQuery(一)
  • JS 面试题总结
  • js操作时间(持续更新)
  • JS专题之继承
  • Linux快速复制或删除大量小文件
  • nodejs实现webservice问题总结
  • Tornado学习笔记(1)
  • vue脚手架vue-cli
  • 代理模式
  • 订阅Forge Viewer所有的事件
  • 二维平面内的碰撞检测【一】
  • 番外篇1:在Windows环境下安装JDK
  • 关于for循环的简单归纳
  • 近期前端发展计划
  • 思考 CSS 架构
  • 思维导图—你不知道的JavaScript中卷
  • 自动记录MySQL慢查询快照脚本
  • Prometheus VS InfluxDB
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • ​520就是要宠粉,你的心头书我买单
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • $(function(){})与(function($){....})(jQuery)的区别
  • (09)Hive——CTE 公共表达式
  • (2)STL算法之元素计数
  • (办公)springboot配置aop处理请求.
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (四)Linux Shell编程——输入输出重定向