Merge Sort for Linked List Python
- Get link
- X
- Other Apps
PROGRAM TO MERGE SORT FOR LINKED LISTS
# create Node using class Node.
class
Node:
def
__init__(
self
, data):
self
.data
=
data
self
.
next
=
None
class
LinkedList:
def
__init__(
self
):
self
.head
=
None
# push new value to linked list
# using append method
def
append(
self
, new_value):
# Allocate new node
new_node
=
Node(new_value)
# if head is None, initialize it to new node
if
self
.head
is
None
:
self
.head
=
new_node
return
curr_node
=
self
.head
while
curr_node.
next
is
not
None
:
curr_node
=
curr_node.
next
# Append the new node at the end
# of the linked list
curr_node.
next
=
new_node
def
sortedMerge(
self
, a, b):
result
=
None
# Base cases
if
a
=
=
None
:
return
b
if
b
=
=
None
:
return
a
# pick either a or b and recur..
if
a.data <
=
b.data:
result
=
a
result.
next
=
self
.sortedMerge(a.
next
,b)
else
:
result
=
b
result.
next
=
self
.sortedMerge(a, b.
next
)
return
result
def
mergeSort(
self
, h):
# Base case if head is None
if
h
=
=
None
or
h.
next
=
=
None
:
return
h
# get the middle of the list
middle
=
self
.getMiddle(h)
nexttomiddle
=
middle.
next
# set the next of middle node to None
middle.
next
=
None
# Apply mergeSort on left list
left
=
self
.mergeSort(h)
# Apply mergeSort on right list
right
=
self
.mergeSort(nexttomiddle)
# Merge the left and right lists
sortedlist
=
self
.sortedMerge(left, right)
return
sortedlist
# Utility function to get the middle
# of the linked list
def
getMiddle(
self
, head):
if
(head
=
=
None
):
return
head
slow
=
head
fast
=
head
while
(fast.
next
!
=
None
and
fast.
next
.
next
!
=
None
):
slow
=
slow.
next
fast
=
fast.
next
.
next
return
slow
# Utility function to print the linked list
def
printList(head):
if
head
is
None
:
print
(
' '
)
return
curr_node
=
head
while
curr_node:
print
(curr_node.data, end
=
" "
)
curr_node
=
curr_node.
next
print
(
' '
)
# Driver Code
if
__name__
=
=
'__main__'
:
li
=
LinkedList()
# Let us create a unsorted linked list
# to test the functions created.
# The list shall be a: 2->3->20->5->10->15
li.append(
15
)
li.append(
10
)
li.append(
5
)
li.append(
20
)
li.append(
3
)
li.append(
2
)
# Apply merge Sort
li.head
=
li.mergeSort(li.head)
print
(
"Sorted Linked List is:"
)
printList(li.head)
OUTPUT
Sorted Linked List is: 2 3 5 10 15 20
- Get link
- X
- Other Apps
Comments
Post a Comment