linked-list-cycle(LeetCode)

題目描述

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. 如何判斷鏈表存在環
使用追趕法,也就是使用快慢兩個指針,fast和slow,fast指針每次走兩步,slow指針每次走一步。如果鏈表存在環,那麼fast和slow最終會相遇,否則fast遇到null結束。
2. 找出環的起始結點
示意圖
點Z爲fast和slow指針的相遇點,設環的長度爲n,則鏈表總長度爲a+n,當slow指針走完a+b步與fast指針相遇時,fast指針已經在環上走了k圈。slow指針走了a+b步,fast指針走了2(a+b)步,fast指針比slow指針多走了k*n步,所以a+b=2(a+b)-k*n。即a=k*n -b,也就是X走a步,等於Z位置上的指針再走k圈,相遇於Y點。
3. 環的長度和鏈表總長度
從相遇點Z開始,slow和fast再次相遇的時候slow指針走過的距離就是環的長度。鏈表總長度爲環的長度和2中求得的環起始結點長度之和。

package sxd.learn.java.leetcode;

/**
 * 
 * @author lab
 * 2016/5/30
 * linked-list-cycle-ii
 * Given a linked list, return the node where the cycle begins. If there is no cycle, return null. 
 */
public class Leetcode9 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ListNode node1 = new ListNode(1);
        ListNode node2 = new ListNode(2);
        ListNode node3 = new ListNode(3);
        ListNode node4 = new ListNode(4);
        ListNode node5 = new ListNode(5);
        ListNode node6 = new ListNode(6);

        node1.next = node2;
        node2.next = node3;
        node3.next = node4;
        node4.next = node5;
        node5.next = node6;
        node6.next = node3;

        System.out.println(detectCycle(node1).val);
    }

    public static ListNode detectCycle(ListNode head) {
        if(head == null)
            return null;
        ListNode fast = head;
        ListNode slow = head;

        boolean isCycle = false;

        while(fast.next != null && fast.next.next != null){
            fast = fast.next.next;
            slow = slow.next; 
            if(slow.equals(fast)){
                isCycle = true;
                break;
            }
        }

        if(isCycle){
            fast = head;
            while(!fast.equals(slow)){
                fast = fast.next;
                slow = slow.next;
            }
            return fast;
        }else{
            return null;
        }

    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章