forked from adnanaziz/EPIJudge
-
Notifications
You must be signed in to change notification settings - Fork 0
/
do_terminated_lists_overlap.py
58 lines (46 loc) · 1.51 KB
/
do_terminated_lists_overlap.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import functools
from test_framework import generic_test
from test_framework.test_failure import TestFailure
from test_framework.test_utils import enable_executor_hook
def overlapping_no_cycle_lists(l0, l1):
def length(L):
length = 0
while L:
length += 1
L = L.next
return length
l0_len, l1_len = length(l0), length(l1)
if l0_len > l1_len:
l0, l1 = l1, l0 # l1 is the longer list
# Advances the longer list to get equal length lists.
for _ in range(abs(l0_len - l1_len)):
l1 = l1.next
while l0 and l1 and l0 is not l1:
l0, l1 = l0.next, l1.next
return l0 # None implies there is no overlap between l0 and l1.
@enable_executor_hook
def overlapping_no_cycle_lists_wrapper(executor, l0, l1, common):
if common:
if l0:
i = l0
while i.next:
i = i.next
i.next = common
else:
l0 = common
if l1:
i = l1
while i.next:
i = i.next
i.next = common
else:
l1 = common
result = executor.run(
functools.partial(overlapping_no_cycle_lists, l0, l1))
if result != common:
raise TestFailure('Invalid result')
if __name__ == '__main__':
exit(
generic_test.generic_test_main("do_terminated_lists_overlap.py",
'do_terminated_lists_overlap.tsv',
overlapping_no_cycle_lists_wrapper))