about summary refs log tree commit diff
path: root/scratch
diff options
context:
space:
mode:
authorWilliam Carroll <wpcarro@gmail.com>2020-11-15T17·42+0000
committerWilliam Carroll <wpcarro@gmail.com>2020-11-15T17·42+0000
commit363519273a0e2e7f3e6d63e8d2017b25f480eac9 (patch)
tree68263c1c9398fbc2ba6c59fc8a09199de143854e /scratch
parentc8330adfcb2bf86c4ad35091d805f35603bc55e0 (diff)
Find the intersection (if any) between two linked lists
As with most linked list questions, this one involves an arcane trick from the
neck-bearded playbook.
Diffstat (limited to 'scratch')
-rw-r--r--scratch/facebook/intersecting-linked-lists.py34
1 files changed, 34 insertions, 0 deletions
diff --git a/scratch/facebook/intersecting-linked-lists.py b/scratch/facebook/intersecting-linked-lists.py
new file mode 100644
index 000000000000..80ac01dafd56
--- /dev/null
+++ b/scratch/facebook/intersecting-linked-lists.py
@@ -0,0 +1,34 @@
+class LinkedList(object):
+    def __init__(self, x):
+        self.val = x
+        self.next = None
+
+    def __repr__(self):
+        if self.next:
+            return "{} -> {}".format(self.val, self.next)
+        return "{}".format(self.val)
+
+def find_intersection(a, b):
+    init_a, init_b = a, b
+
+    while a != b:
+        a = a.next if a.next else init_b
+        b = b.next if b.next else init_a
+
+    return a
+
+# make A...
+e1 = LinkedList(5)
+d1 = LinkedList(2); d1.next = e1
+c1 = LinkedList(3); c1.next = d1 # shared
+b1 = LinkedList(1); b1.next = c1 # shared
+a1 = LinkedList(4); a1.next = b1 # shared
+
+# make B...
+c2 = LinkedList(1); c2.next = c1
+b2 = LinkedList(5); b2.next = c2
+a2 = LinkedList(6); a2.next = b2
+
+print(a1)
+print(a2)
+print(find_intersection(a1, a2).val)