首页 > 代码库 > CTCI 2.6
CTCI 2.6
Given a circular linked list, implement an algorithm which returns the node at the beginning of the loop.
DEFINITION
Circular linked list: A (corrupt) linked list in which a node‘s next pointer points to an earlier node, so as to make a loop in the linked list.
EXAMPLE
Input:A ->B->C->D->E-> C[thesameCasearlier]
Output:C
There is a same problem on leetcode. Use a fast pointer and a slow pointer to find the meet point, then use two slow pointer from the head of the list and the meet point, the position where this two pointers meet is just the start point. Another way is to use HashSet to record each node, the first node exist in the set would be the start point.
/*We could use a fast pointer and a slow pointer to find the node where the two pointer meets, since the list is circlelist, we are sure to find such a node. We could have:Fast_length = Slow_length + n * circle_length, where n >= 1, since fast length must catch up slow one before it finishes one circle. We define the distance of list head to where circle start as K, and the start to wheretwo pointers meet as L, then it is easy to show: Slow_length = K + L, we restrict the speed of fast as two times of the slow, 2 nodes for fast and one node for slow, then we could haveSlow_length = n * circle_length, then we haveK + L = n * circle_length, rewrite it asK = (n-1)*circle_length + (circle_length - L). From this, we know that from the meet point to the start point,it is just the disctance from head to start point, plus some circle_length. Then we could have two slowpointer start from head and meet point, where they meet is just the start point of the circle. The time complexityis O(N) and the space complexity is O(1).Another way is to use HasSet to record each node, the first node that exist in hashset would be the startpoint. The time complexity is O(N) and space complexity is O(N)*/import java.util.*;public class CircleListStartPoint { public Node findStart(Node head) { //Pay attention to the first case Node slow = head, fast = head; do { slow = slow.next; fast = fast.next.next; }while(slow != fast); Node temp = head; while(slow != temp) { slow = slow.next; temp = temp.next; } return slow; } public Node findStart2(Node head) { HashSet<Node> set = new HashSet<Node>(); Node temp = head; while(true) { if(set.contains(temp) == false) { set.add(temp); temp = temp.next; } else { return temp; } } } public static void main(String[] args) { Node node1 = new Node(1); Node node2 = new Node(2); Node node3 = new Node(3); Node node4 = new Node(4); Node node5 = new Node(5); Node node6 = new Node(6); node1.next = node2; node2.next = node3; node3.next = node4; node4.next = node5; node5.next = node6; node6.next = node1; CircleListStartPoint clsp = new CircleListStartPoint(); System.out.println(clsp.findStart(node1).val); }}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。