博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
142. Linked List Cycle II
阅读量:5142 次
发布时间:2019-06-13

本文共 2142 字,大约阅读时间需要 7 分钟。

博主决定认真刷题~~~

142. Linked List Cycle II

Total Accepted: 70643 Total Submissions: 224496 Difficulty: Medium

 

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

Note: Do not modify the linked list.

Follow up:

Can you solve it without using extra space?

 

现在有两个指针,第一个指针,每走一次走一步,第二个指针每走一次走两步,如果他们走了t次之后相遇在K点

那么       指针一  走的路是      t = X + nY + K        ①

             指针二  走的路是     2t = X + mY+ K       ②          m,n为未知数

把等式一代入到等式二中, 有

2X + 2nY + 2K = X + mY + K

=>   X+K  =  (m-2n)Y    ③

这就清晰了,X和K的关系是基于Y互补的。等于说,两个指针相遇以后,再往下走X步就回到Cycle的起点了。这就可以有O(n)的实现了。

/** * Linked List Cycle II * Given a linked list, return the node where the cycle begins. If there is no cycle, return null. * Note: Do not modify the linked list. * Tag : Linked List Two Pointers * Similar Problems: (M) Linked List Cycle (H) Find the Duplicate Number *  * Analysis: * fast point: 2d = x + y + mC * slow point: d = x + y + nC * x + y = (m - 2n) * C*/public class LinkedListCycle_2 {    public static ListNode detectCycle(ListNode head) {        if (head == null || head.next == null) {            return null;        }          ListNode fast = head;        ListNode slow = head;        while (fast != null && fast.next != null) {            fast = fast.next.next;            slow = slow.next;            if (fast == slow) {                break;            }        }        if (slow == fast) {            fast = head;            while (slow != fast) {                slow = slow.next;                fast = fast.next;            }            return slow;        }        else {            return null;        }       }        public static void main(String[] args) {        ListNode res = new ListNode(1);        res.next = new ListNode(2);        res.next.next = new ListNode(3);        res.next.next.next = new ListNode(4);        res.next.next.next.next = new ListNode(5);        res.next.next.next.next.next = new ListNode(6);        res.next.next.next.next.next = res.next.next.next;        System.out.print(detectCycle(res).val);        }}Status API Training Shop Blog About© 2016 GitHub, Inc. Terms Privacy Security Contact Help

 

 

 

 

转载于:https://www.cnblogs.com/joannacode/p/5310731.html

你可能感兴趣的文章
一个Tahoma字体bug引发的思考—关于样式bug的分析流程
查看>>
机器学习三种算法基础介绍
查看>>
js内置对象
查看>>
wpf datagrid performance
查看>>
总结Content Provider的使用
查看>>
hdu-5112-A Curious Matt
查看>>
SCII码表 键盘常用ASCII码
查看>>
Asp.Net Core 自定义设置Http缓存处理
查看>>
深入浅出SharePoint—使用回收站
查看>>
li设置多选和取消选择的样式、输入数据类型判断
查看>>
Hive数据仓库与数据库的异同
查看>>
《诗词大闯关》问卷调查心得与体会
查看>>
JSON.stringify语法
查看>>
HTML如何让文本两端对齐
查看>>
大内高手—惯用手法
查看>>
解决华为手机不打印Log信息的问题
查看>>
linux下安装tomcat
查看>>
Nginx 在各种语言框架下的配置 - 以 codeigniter 为例
查看>>
Nagios+msn+fetion自定义时间发送报警消息
查看>>
python基本数据结构栈stack和队列queue
查看>>