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 where
two 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 have
Slow_length = n * circle_length, then we have
K + L = n * circle_length, rewrite it as
K  = (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 slow
pointer start from head and meet point, where they meet is just the start point of the circle. The time complexity
is 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 start
point. 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);
    }
}

CTCI 2.6

时间: 2024-10-15 17:31:09

CTCI 2.6的相关文章

CTCI 3.4

In the classic problem of the Towers of Hanoi, you have 3 towers and Ndisks of different sizes which can slide onto any tower.The puzzle starts with disks sorted in ascending order of size from top to bottom (i.e., each disk sits on top of an even la

CTCI 2.3

Implement an algorithm to delete a node in the middle of a singly linked list, given only access to that node.EXAMPLEInput: the node c from the linked list a->b->c->d->eResult: nothing isreturned, but the new linked list looks like a- >b- &

CTCI 1.3

Description: Given two strings, write a method to decide if one is a permutation of the other. We could use the same idea from CTCI 1.1. The only difference is that in 1.1 we just need to know whether one character appear or not, in this problem we n

CTCI 2.1

Write code to remove duplicates from an unsorted linked list.FOLLOW UPHow would you solve this problem if a temporary buffer is not allowed? /* Use a HashSet to record whether a val has appeared or not. We assume that the linked list is singly linked

CTCI 2.2

Implement an algorithm to find the kth to last element of a singly linked list. Classical "Runner" Technique of linkedlist /*Use two pointers, forward one K nodes, then the two pointers form a "window" contains K nodes. Then move two p

CTCI 3.3

Imagine a (literal) stack of plates. If the stack gets too high, it might topple. Therefore, in real life, we would likely start a new stack when the previous stack exceeds some threshold. Implement a data structureSetOf Stacks that mimics this. SetO

CTCI 3.1

Describe how you could use a single array to implement three stacks. Divide the array into three fixed parts, each stands for a stack. /*Fixed Size Stacks*/ import java.util.*; public class ThreeStacks { int stackSize = 100; int[] buffer = new int[st

CTCI 2.7

Implement a function to check if a linked list is a palindrome. Reverse the second half of the list and then compare it with the first half. /* Assume that we can destroy the list, reverse the second half of the list and compare it with the first hal

CTCI 1.2

Since I mainly use Java, this problem seems meaning less for me to implement it with Java. Just use StringBuilder to append each character in string from the end to the start. The time complexity is O(N) and space complexity is O(N), too. If using C+

CTCI 4.8

You have two very large binary trees: T1, with millions of nodes, and T2, with hundreds of nodes. Create an algorithm to decide if T2 is a subtree of T1. A tree T2 is a subtree of T1 if there exist a node in T1 such that the subtree of nis identical