Skip to content

Commit 82507bf

Browse files
authored
Create mergesort_linkedlist.py
1 parent 45ab850 commit 82507bf

File tree

1 file changed

+77
-0
lines changed

1 file changed

+77
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
from __future__ import annotations
2+
3+
class Node:
4+
def __init__(self, data: int) -> None:
5+
self.data = data
6+
self.next = None
7+
8+
class LinkedList:
9+
def __init__(self):
10+
self.head = None
11+
12+
def insert(self, new_data: int) -> None:
13+
new_node = Node(new_data)
14+
new_node.next = self.head
15+
self.head = new_node
16+
17+
def printLL(self) -> None:
18+
temp = self.head
19+
if temp == None:
20+
return 'Linked List is empty'
21+
while temp.next:
22+
print(temp.data, '->', end='')
23+
temp = temp.next
24+
print(temp.data)
25+
return
26+
27+
# Merge two sorted linked lists
28+
def merge(left, right):
29+
if not left:
30+
return right
31+
if not right:
32+
return left
33+
34+
if left.data < right.data:
35+
result = left
36+
result.next = merge(left.next, right)
37+
else:
38+
result = right
39+
result.next = merge(left, right.next)
40+
41+
return result
42+
43+
# Merge sort for linked list
44+
def merge_sort(head):
45+
if not head or not head.next:
46+
return head
47+
48+
# Find the middle of the list
49+
slow = head
50+
fast = head.next
51+
while fast and fast.next:
52+
slow = slow.next
53+
fast = fast.next.next
54+
55+
left = head
56+
right = slow.next
57+
slow.next = None
58+
59+
left = merge_sort(left)
60+
right = merge_sort(right)
61+
62+
return merge(left, right)
63+
64+
if __name__ == "__main__":
65+
ll = LinkedList()
66+
print("Enter the space-separated values of numbers to be inserted in the linked list prompted below:")
67+
arr = list(map(int, input().split()))
68+
for num in arr:
69+
ll.insert(num)
70+
71+
print("Linked list before sorting:")
72+
ll.printLL()
73+
74+
ll.head = merge_sort(ll.head)
75+
76+
print('Linked list after sorting:')
77+
ll.printLL()

0 commit comments

Comments
 (0)