Linked List Cycle II 找链表环入口 @LeetCode

来源:互联网 发布:网络推广整合方案 编辑:程序博客网 时间:2024/05/17 00:56

经典链表环的问题


package Level3;import Utility.ListNode;/** * 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? * */public class S130 {public static void main(String[] args) {}public ListNode detectCycle(ListNode head) {if(head == null || head.next ==null){return null;}ListNode slow = head;ListNode fast = head;// 找到第一次相遇点while(fast!=null && fast.next!=null && slow!=null){slow = slow.next;fast = fast.next.next;if(slow == fast){// 相遇break;}}// 检查是否因为有环退出或是因为碰到null而退出if(slow==null || fast==null || fast.next==null){return null;}// 把慢指针移到链表头,然后保持快慢指针同样的速度移动// 再次相遇时即为环的入口slow = head;while(slow != fast){slow = slow.next;fast = fast.next;}// 现在快慢指针都指向环的入口return slow;}}


重写时的注意点写在注解里了

/** * 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;        // No node or single node ==> No cycle        }        ListNode fast = head;        ListNode slow = head;        while(fast!=null && fast.next!=null && slow!=null){            fast = fast.next.next;            slow = slow.next;            if(fast == slow){                break;            }        }                if(fast != slow){   // no cycle            return null;        }                slow = head;        while(fast!=null && slow!=null){            if(fast == slow){       // Check first! eg: 1,2                break;            }            fast = fast.next;            slow = slow.next;        }        return fast;    }}