public static ListNode detectCycle(ListNode head) {
		if (head == null || head.next == null || head.next.next == null)
			return null;

		ListNode oneStep = head.next;
		ListNode twoStep = head.next.next;
		ListNode ecounterPoint = null;
		while (twoStep != null) {
			if (oneStep == twoStep) {
				ecounterPoint = oneStep;
				break;
			}
			if (twoStep.next == null || twoStep.next.next == null)
				return null;
			twoStep = twoStep.next.next;
			oneStep = oneStep.next;
		}

		ListNode startPoint = null;
		ListNode newHead = head;
		while (true) {
			if (ecounterPoint == newHead) {
				startPoint = ecounterPoint;
				break;
			}
			newHead = newHead.next;
			ecounterPoint = ecounterPoint.next;
		}
		return startPoint;
	}