Leetcode:Linked List Cycle II

来源:互联网 发布:人体骨骼软件 编辑:程序博客网 时间:2024/05/07 11:37

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?


解析:其实解题思路比较数学化,流程如下


1. 使用快慢指针,若指针相遇,则确定有环。


2. 若快指针与慢指针相遇,则让第二个慢指针从起点开始出发。


3. 两个慢指针同时前进,最后会在环的交汇点相遇。如果想不明白可以自己画图琢磨一下。


代码:


/** * Definition for singly-linked list. * class ListNode { *     int val; *     ListNode next; *     ListNode(int x) { *         val = x; *         next = null; *     } * } */public class Solution {    public ListNode detectCycle(ListNode head) {        if(head==null||head.next==null)return null;                ListNode dummy = new ListNode(0);        dummy.next = head;                ListNode fast = dummy;        ListNode slow = dummy;        ListNode marker = dummy;                while(fast!=null&&fast.next!=null)        {            slow = slow.next;            fast = fast.next.next;            if(slow==fast)break;        }                if(fast==null||fast.next==null)            return null;        else        {            while(true)            {                slow = slow.next;                marker = marker.next;                if(slow==marker)return marker;            }        }    }}


0 0