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?
Can you solve it without using extra space?
假设链表长度为n,环开始的节点为到头节点有k步,p1和p2在距离环开始的节点m步的地方相遇(按顺时针),假设相遇节点到环开始的节点d步(按顺时针),那么p1走的路程为k+m,p2走的路程为k+m+d+m,显然p2走的路程为p1的2倍,于是2(k+m)=k+2m+d,于是我们推出d=k。
p1和p2相遇后,把p1只想头节点,然后p1,p2都一次走一步,走了k步后p1 p2相遇,该节点就是环开始的节点。
Time complexity is O(n), constant space./** * 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) return null; ListNode slow = head; ListNode fast = head; //找到第一次相遇点 while(fast != null && fast.next != null) { fast = fast.next.next; slow = slow.next; if(fast == slow) break; //相遇 } //检查是否因为有环退出或是因为碰到null而退出 if(fast == null || fast.next == null) return null; // 把慢指针移到链表头,然后保持快慢指针同样的速度移动 // 再次相遇时即为环的入口 slow = head; while(fast != slow) { slow = slow.next; fast = fast.next; } //快慢指针都指向入口 return fast; } }
No comments:
Post a Comment