Weird copying linked list-ish thing with random
This commit is contained in:
parent
5df7489f27
commit
efb8f453ae
@ -1,3 +1,4 @@
|
|||||||
|
import dataclasses
|
||||||
import typing
|
import typing
|
||||||
|
|
||||||
|
|
||||||
@ -14,6 +15,30 @@ class ListNode:
|
|||||||
self.next = next
|
self.next = next
|
||||||
|
|
||||||
|
|
||||||
|
class ListNodeRandom:
|
||||||
|
"""ListNodeRandom is another weirdo linked list thing from
|
||||||
|
leetcode that is obviously very different than a binary tree
|
||||||
|
node :upside_down_face:
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
x: int,
|
||||||
|
next: typing.Optional["ListNodeRandom"] = None,
|
||||||
|
random: typing.Optional["ListNodeRandom"] = None,
|
||||||
|
):
|
||||||
|
self.val = x
|
||||||
|
self.next = next
|
||||||
|
self.random = random
|
||||||
|
|
||||||
|
|
||||||
|
@dataclasses.dataclass
|
||||||
|
class ListNodeRandomNicely:
|
||||||
|
val: int
|
||||||
|
next: typing.Optional["ListNodeRandomNicely"] = None
|
||||||
|
random: typing.Optional["ListNodeRandomNicely"] = None
|
||||||
|
|
||||||
|
|
||||||
class BinaryTreeNode(typing.Protocol):
|
class BinaryTreeNode(typing.Protocol):
|
||||||
val: int
|
val: int
|
||||||
left: typing.Optional["BinaryTreeNode"]
|
left: typing.Optional["BinaryTreeNode"]
|
||||||
|
@ -509,3 +509,29 @@ def count_factorial_trailing_zeroes(number: int) -> int:
|
|||||||
divisor *= 5
|
divisor *= 5
|
||||||
|
|
||||||
return zeroes_count
|
return zeroes_count
|
||||||
|
|
||||||
|
|
||||||
|
def copy_random_list(
|
||||||
|
head: stdlib.ListNodeRandom | None,
|
||||||
|
) -> stdlib.ListNodeRandom | None:
|
||||||
|
if head is None:
|
||||||
|
return None
|
||||||
|
|
||||||
|
ordered = []
|
||||||
|
cur = head
|
||||||
|
while cur is not None:
|
||||||
|
ordered.append(cur)
|
||||||
|
cur = cur.next
|
||||||
|
|
||||||
|
ordered_copy = [stdlib.ListNodeRandom(entry.val) for entry in ordered]
|
||||||
|
|
||||||
|
hash_idx = {hash(n): i for i, n in enumerate(ordered)}
|
||||||
|
|
||||||
|
for i, entry in enumerate(ordered):
|
||||||
|
if i + 1 < len(ordered_copy):
|
||||||
|
ordered_copy[i].next = ordered_copy[i + 1]
|
||||||
|
|
||||||
|
if entry.random is not None:
|
||||||
|
ordered_copy[i].random = ordered_copy[hash_idx[hash(entry.random)]]
|
||||||
|
|
||||||
|
return ordered_copy[0]
|
||||||
|
Loading…
Reference in New Issue
Block a user