LeetCode | Linked List Cycle II

来源:互联网 发布:云计算架构师要求 编辑:程序博客网 时间:2024/06/06 09:26

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?

/** * Definition for singly-linked list. * class ListNode { *     int val; *     ListNode next; *     ListNode(int x) { *         val = x; *         next = null; *     } * } */
 //思路:
首先利用快慢双指针向后遍历(slow每次向后一格,fast每次向后两格),当两个指针重合时,则list中一定存在cycle
然后让fast_pointer停在两指针相遇的位置,而让slow_pointer回到head,让两指针同步的每次向后遍历一格,则两指针相遇的node即为cycle begin的node(有点像单纯的智力题。。。)

public class Solution {    public ListNode detectCycle(ListNode head) {        if(head==null || head.next==null) return null;                ListNode slow_pointer = head;        ListNode fast_pointer = head;                boolean hasCycle = false;        while(fast_pointer!=null && fast_pointer.next!=null){  //判断list中是否有cycle的存在,思路与昨天的题一样            slow_pointer = slow_pointer.next;            fast_pointer = fast_pointer.next.next;            if(slow_pointer == fast_pointer){                hasCycle = true;                break;                //注意:此处要有break,否则两个pointer会在cycle中一直遍历下去,无限循环            }        }                if(hasCycle){                    slow_pointer = head;            while(true){                if(slow_pointer == fast_pointer) return slow_pointer;                slow_pointer = slow_pointer.next;                fast_pointer = fast_pointer.next;          //if(slow_pointer == fast_pointer) return slow_pointer;  注:判断的语句不能放在后边,不然当list中tail.next=head时会出错            }        }                return null;    }}


0 0