/
4.3_MergeSortLinkedList.py
81 lines (72 loc) · 2.71 KB
/
4.3_MergeSortLinkedList.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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import UnorderedList
#===========================================================================
# create a linked list to test MergeSort()
myList = UnorderedList()
myList.add(13)
myList.add(38)
myList.add(50)
myList.add(14)
myList.add(45)
myList.add(27)
myList.append(70)
myList.insert(4, 48)
#===========================================================================
# define a function to return a sliced linked list given the startnode and endnode
def getSlice(MLL, first, last):
# a function validating input params should be added later on
current = MLL.head
while current != first:
current = current.getNext()
sliceLL = UnorderedList()
while current != last.getNext():
sliceLL.append(current.getData())
current = current.getNext()
return sliceLL
# define a function to return the midnode between the startnode and endnode
def getMid(MLL, first, last):
# a function validating input params should be added later on
current = MLL.head
while current != first:
current = current.getNext()
faster = current
while faster.getNext().getNext() != last.getNext():
current = current.getNext()
if faster.getNext().getNext() == last:
break
else:
faster = faster.getNext().getNext()
return current
# define a function to merge-sort a linked list
def MergeSort(MLL, first, last):
# a function validating input params should be added later on
if first != last:
mid = getMid(MLL, first, last)
MergeSort(MLL, first, mid)
MergeSort(MLL, mid.getNext(), last)
leftLL = getSlice(MLL, first, mid)
rightLL = getSlice(MLL, mid.getNext(), last)
leftNode = leftLL.head
rightNode = rightLL.head
mergeNode = first
while leftNode != None and rightNode != None:
if leftNode.getData() < rightNode.getData():
mergeNode.setData(leftNode.getData())
leftNode = leftNode.getNext()
else:
mergeNode.setData(rightNode.getData())
rightNode = rightNode.getNext()
mergeNode = mergeNode.getNext()
while leftNode != None:
mergeNode.setData(leftNode.getData())
leftNode = leftNode.getNext()
mergeNode = mergeNode.getNext()
while rightNode != None:
mergeNode.setData(rightNode.getData())
rightNode = rightNode.getNext()
mergeNode = mergeNode.getNext()
#===========================================================================
MergeSort(myList, myList.head, myList.tail)
current = myList.head
while current != None:
print current.getData()
current = current.getNext()