From 14b236eb84eb903be670ecad2fe9b36e0c8dad8c Mon Sep 17 00:00:00 2001
From: "Bradley M. Small" <bradley_small@hotmail.com>
Date: Wed, 16 Oct 2019 17:15:19 -0400
Subject: [PATCH] fixing broken solution and adding 2 more

---
 .tags   | 15 ++++++++++
 main.py | 90 +++++++++++++++++++++++++++++++++------------------------
 2 files changed, 67 insertions(+), 38 deletions(-)
 create mode 100644 .tags

diff --git a/.tags b/.tags
new file mode 100644
index 0000000..1f6c81b
--- /dev/null
+++ b/.tags
@@ -0,0 +1,15 @@
+!_TAG_FILE_FORMAT	2	/extended format; --format=1 will not append ;" to lines/
+!_TAG_FILE_SORTED	1	/0=unsorted, 1=sorted, 2=foldcase/
+!_TAG_PROGRAM_AUTHOR	Darren Hiebert	/dhiebert@users.sourceforge.net/
+!_TAG_PROGRAM_NAME	Exuberant Ctags	//
+!_TAG_PROGRAM_URL	http://ctags.sourceforge.net	/official site/
+!_TAG_PROGRAM_VERSION	5.9~svn20110310	//
+LList	main.py	/^class LList:$/;"	c
+Node	main.py	/^class Node:$/;"	c
+__init__	main.py	/^    def __init__(self, head):$/;"	m	class:LList
+__init__	main.py	/^    def __init__(self, val, next=None):$/;"	m	class:Node
+main	main.py	/^def main():$/;"	f
+next	main.py	/^    def next(self):$/;"	m	class:LList
+reverse	main.py	/^    def reverse(self):$/;"	m	class:LList
+rewind	main.py	/^    def rewind(self):$/;"	m	class:LList
+show	main.py	/^    def show(self):$/;"	m	class:LList
diff --git a/main.py b/main.py
index 22a777c..24deec5 100755
--- a/main.py
+++ b/main.py
@@ -7,7 +7,7 @@ some exception handling and proper error checking. """
 class Node:
     """ The node will be the basis of a singly linked list """
     def __init__(self, val, next=None):
-        self.val = val;
+        self.val = str(val);
         self.next = next
 
 
@@ -33,7 +33,7 @@ class LList:
         print("[", end = '')
         comma = ''
         while n:
-            print(comma, n.val, end = '')
+            print(comma, n.val if n.val[0] != '~' else n.val[1:], end = '')
             comma = ','
             n = n.next
         print(" ]")
@@ -54,45 +54,14 @@ class LList:
 def main():
     """ Main driver create lists, reverse them, find beginning overlap """
     # This is just setup
-    mlist = LList(Node(3,Node(7,Node(8,Node(10)))))
-    nlist = LList(Node(99,Node(1,Node(8,Node(10)))))
+    cnode = Node(8,Node(10))
+    mlist = LList(Node(3,Node(7,cnode)))
+    nlist = LList(Node(99,Node(1,cnode)))
 
     mlist.show()
     nlist.show()
 
 
-
-
-
-    # list reversal in place solution
-    # this is in constant space but the solution is actually
-    # in O(m+n+l) where l is the final length of the overlapped
-    # string. Still in constant space since the reversal is in place
-    nlist.reverse()
-    mlist.reverse()
-
-    # constant space
-    # O(m+n) time
-    nnode = nlist.rewind()
-    mnode = mlist.rewind()
-
-    overlap = None
-    while nnode.val == mnode.val:
-        overlap = nnode
-        nnode = nlist.next()
-        mnode = mlist.next()
-
-    print("The overlap = ", overlap.val)
-
-    # At this point the list would have to be reversed again to actually
-    # get the true overlapped list, though not part of the problem it
-    # doubles the effort to achieve
-    nlist.reverse()
-    mlist.reverse()
-
-    print("The overlap list : ", end ='')
-    LList(overlap).show()
-
     # solution using 2 "pointers" solves the O(m+n) in constant space
     # aspect of the problem.
     mwalker = mlist.head
@@ -107,11 +76,56 @@ def main():
             nwalker = mlist.heead
     print("The overlap = ", nwalker.val);
 
-    # Getting the actual list, though not part of the problem no longer
-    # takes double the processing.
+    # Getting the actual list, though not part of the problem
+    # is pretty much free
     print("The overlap list is:", end ='')
     LList(nwalker).show();
 
+    # this solution is partially destructive in that it
+    # modifies the val. For this I changed it to a string
+    # and added a ~ to ones visited in one list. when traversing
+    # the other list finding the ~ shows the overlap. The show()
+    # was modified to not show the ~. Certainly a cleanup could be
+    # employed to go through an remove all the ~.
+    # This is also O(n+m)
+    mnode = mlist.rewind()
+    while mnode:
+        mnode.val = "~" + str(mnode.val)
+        mnode = mnode.next
+
+    nnode = nlist.rewind()
+    while nnode.val[0] != '~':
+        nnode = nlist.next()
+    overlap = nnode
+    print("The overlap = ", overlap.val[1:])
+    print("The overlap list : ", end ='')
+    LList(overlap).show()
+
+
+
+    # this solution is destructive as it sets
+    # all the "next" pointers to None so once the
+    # overlap is found you are done, but you no longer
+    # have the rest of the list
+    mnode = mlist.rewind()
+    while mnode:
+        temp = mnode.next
+        mnode.next = None
+        mnode = temp
+
+    # constant space
+    # O(m+n) time
+    nnode = nlist.rewind()
+
+    overlap = None
+    while nnode.next:
+        nnode = nlist.next()
+    overlap = nnode
+
+    print("The overlap = ", overlap.val[1:])
+    print("The overlap list : ", end ='')
+    LList(overlap).show()
+
 
 if __name__ == "__main__":
     main()
-- 
GitLab