From 5e30cd0b48dafb9fd426b22eba8c4266be5c589d Mon Sep 17 00:00:00 2001 From: alex Date: Sat, 30 May 2026 23:04:28 +0300 Subject: [PATCH 1/3] added first task solution --- IntersectionOfTwoLinkedListsSolution.php | 110 +++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 IntersectionOfTwoLinkedListsSolution.php diff --git a/IntersectionOfTwoLinkedListsSolution.php b/IntersectionOfTwoLinkedListsSolution.php new file mode 100644 index 0000000..adccbba --- /dev/null +++ b/IntersectionOfTwoLinkedListsSolution.php @@ -0,0 +1,110 @@ +hash[$key1])) { + return $this->hash[$key1]; + } + $this->hash[$key1] = $headA; + } + + if ($headB) { + $key2 = spl_object_id($headB); + if (isset($this->hash[$key2])) { + return $this->hash[$key2]; + } + $this->hash[$key2] = $headB; + } + + return $this->getIntersectionNode($headA?->next, $headB?->next); + } +} + +class ListNode +{ + public $val = 0; + public $next = null; + + function __construct($val) + { + $this->val = $val; + } +} From 1afab8944ff4020648ba84c0dc5fd91392c4dc05 Mon Sep 17 00:00:00 2001 From: alex Date: Mon, 1 Jun 2026 23:12:31 +0300 Subject: [PATCH 2/3] added second task solution --- FractionToRecurringDecimal.php | 91 ++++++++++++++++++++++++ IntersectionOfTwoLinkedListsSolution.php | 11 +-- 2 files changed, 94 insertions(+), 8 deletions(-) create mode 100644 FractionToRecurringDecimal.php diff --git a/FractionToRecurringDecimal.php b/FractionToRecurringDecimal.php new file mode 100644 index 0000000..b92712e --- /dev/null +++ b/FractionToRecurringDecimal.php @@ -0,0 +1,91 @@ + O(n), где n - количество цифр в итоговом остатке. + * + * @param Integer $numerator + * @param Integer $denominator + * @return String + */ + function fractionToDecimal($numerator, $denominator) { + if ($numerator === 0) { + return "0"; + } + + $sign = ''; + if ($numerator < 0 && $denominator > 0 || $numerator > 0 && $denominator < 0) { + $sign = '-'; + } + + $numerator = abs($numerator); + $denominator = abs($denominator); + + $quotient = $sign . (int) floor($numerator / $denominator); + $remainder = $numerator % $denominator; + + if ($remainder === 0) { + $this->hash[$remainder] = $quotient; + + if (count($this->hash) === 1) { + return implode('', $this->hash); + } + $first = array_shift($this->hash); + return $first . '.' . implode('', $this->hash); + + } + + if (array_key_exists($numerator, $this->hash)) { + $this->hash[$numerator] = "({$quotient}"; + $this->hash[] = ")"; + $first = array_shift($this->hash); + return $first . '.' . implode('', $this->hash); + } + + if ($this->first) { + $this->hash['first'] = $quotient; + $this->first = false; + } else { + $this->hash[$numerator] = $quotient; + } + + + return $this->fractionToDecimal($remainder * 10, $denominator); + } +} diff --git a/IntersectionOfTwoLinkedListsSolution.php b/IntersectionOfTwoLinkedListsSolution.php index adccbba..0affa3f 100644 --- a/IntersectionOfTwoLinkedListsSolution.php +++ b/IntersectionOfTwoLinkedListsSolution.php @@ -27,23 +27,19 @@ * * * Example 1: - * - * * Input: intersectVal = 8, listA = [4,1,8,4,5], listB = [5,6,1,8,4,5], skipA = 2, skipB = 3 * Output: Intersected at '8' * Explanation: The intersected node's value is 8 (note that this must not be 0 if the two lists intersect). * From the head of A, it reads as [4,1,8,4,5]. From the head of B, it reads as [5,6,1,8,4,5]. There are 2 nodes before the intersected node in A; There are 3 nodes before the intersected node in B. * - Note that the intersected node's value is not 1 because the nodes with value 1 in A and B (2nd node in A and 3rd node in B) are different node references. In other words, they point to two different locations in memory, while the nodes with value 8 in A and B (3rd node in A and 4th node in B) point to the same location in memory. - * Example 2: - * * + * Example 2: * Input: intersectVal = 2, listA = [1,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1 * Output: Intersected at '2' * Explanation: The intersected node's value is 2 (note that this must not be 0 if the two lists intersect). * From the head of A, it reads as [1,9,1,2,4]. From the head of B, it reads as [3,2,4]. There are 3 nodes before the intersected node in A; There are 1 node before the intersected node in B. - * Example 3: - * * + * Example 3: * Input: intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2 * Output: No intersection * Explanation: From the head of A, it reads as [2,6,4]. From the head of B, it reads as [1,5]. Since the two lists do not intersect, intersectVal must be 0, while skipA and skipB can be arbitrary values. @@ -51,7 +47,6 @@ * * * Constraints: - * * The number of nodes of listA is in the m. * The number of nodes of listB is in the n. * 1 <= m, n <= 3 * 104 @@ -66,7 +61,7 @@ class Solution private array $hash = []; /** - * Сложность O (n + m), где m это позиция искомого элемента в списке A, n - в списке B. + * Сложность O (n), где n это позиция самого дальнего искомого элемента. * * @param ListNode $headA * @param ListNode $headB From a65c96f340cf738d0c9b1f2dcc45f491a9dfeaa5 Mon Sep 17 00:00:00 2001 From: alex Date: Fri, 12 Jun 2026 20:56:56 +0300 Subject: [PATCH 3/3] refactored --- IntersectionOfTwoLinkedListsSolution.php | 52 ++++++++++++++++-------- 1 file changed, 36 insertions(+), 16 deletions(-) diff --git a/IntersectionOfTwoLinkedListsSolution.php b/IntersectionOfTwoLinkedListsSolution.php index 0affa3f..40ef607 100644 --- a/IntersectionOfTwoLinkedListsSolution.php +++ b/IntersectionOfTwoLinkedListsSolution.php @@ -58,38 +58,58 @@ */ class Solution { - private array $hash = []; + private ?ListNode $headA = null; + private ?ListNode $headB = null; /** - * Сложность O (n), где n это позиция самого дальнего искомого элемента. + * Сложность O(n + m) по времени и O(1) по памяти, через рекурсию и 2 указателя. * * @param ListNode $headA * @param ListNode $headB * @return ListNode */ - function getIntersectionNode($headA, $headB) + function getIntersectionNodeRecursive($headA, $headB) { if ($headA === $headB) { return $headA; } - if ($headA) { - $key1 = spl_object_id($headA); - if (isset($this->hash[$key1])) { - return $this->hash[$key1]; - } - $this->hash[$key1] = $headA; + //просто заполним изначальные головы при первом проходе + if (empty($this->headA)) { + $this->headA = $headA; } + if (empty($this->headB)) { + $this->headB = $headB; + } + + $nextA = !empty($headA) ? $headA->next : $this->headB; + $nextB = !empty($headB) ? $headB->next : $this->headA; + + return $this->getIntersectionNodeRecursive($nextA, $nextB); + } + + /** + * Сложность O(n + m) по времени и O(1) по памяти, итеративно и через 2 указателя. + * + * @param ListNode $headA + * @param ListNode $headB + * @return ListNode + */ + function getIntersectionNodeIterative($headA, $headB) + { + if ($headA === $headB) { + return $headA; + } + + $a = $headA; + $b = $headB; - if ($headB) { - $key2 = spl_object_id($headB); - if (isset($this->hash[$key2])) { - return $this->hash[$key2]; - } - $this->hash[$key2] = $headB; + while ($a !== $b) { + $a = !empty($a) ? $a->next : $headB; + $b = !empty($b) ? $b->next : $headA; } - return $this->getIntersectionNode($headA?->next, $headB?->next); + return $a; } }