扁平化链表的Python程序
给定一个链表,其中每个节点都表示一个链表并包含其类型的两个指针:
- 指向主列表中下一个节点的指针(我们在下面的代码中称其为“右”指针)。
- 指向该节点指向的链表的指针(我们在下面的代码中将其称为“向下”指针)。
所有链表都已排序。请参阅以下示例
5 -> 10 -> 19 -> 28
| | | |
V V V V
7 20 22 35
| | |
V V V
8 50 40
| |
V V
30 45
编写一个函数flatten() 将列表展平为单个链表。扁平化的链表也应该排序。比如上面的输入列表,输出列表应该是5->7->8->10->19->20->22->28->30->35->40->45->50 .
这个想法是对链表使用合并排序的 Merge() 过程。我们使用 merge() 来一个一个地合并列表。我们递归地合并()当前列表与已经展平的列表。
向下指针用于链接展平列表的节点。
下面是上述方法的实现:
Python3
# Python program for flattening
# a Linked List
class Node():
def __init__(self, data):
self.data = data
self.right = None
self.down = None
class LinkedList():
def __init__(self):
# Head of list
self.head = None
# Utility function to insert a
# node at beginning of the
# linked list
def push(self, head_ref, data):
# 1 & 2: Allocate the Node &
# Put in the data
new_node = Node(data)
# Make next of new Node as head
new_node.down = head_ref
# 4. Move the head to point to
# new Node
head_ref = new_node
# 5. Return to link it back
return head_ref
def printList(self):
temp = self.head
while(temp != None):
print(temp.data, end = " ")
temp = temp.down
print()
# An utility function to merge two
# sorted linked lists
def merge(self, a, b):
# If the first linked list is empty
# then second is the answer
if(a == None):
return b
# If second linked list is empty
# then first is the result
if(b == None):
return a
# Compare the data members of the
# two linked lists and put the
# larger one in the result
result = None
if (a.data < b.data):
result = a
result.down =
self.merge(a.down,b)
else:
result = b
result.down =
self.merge(a,b.down)
result.right = None
return result
def flatten(self, root):
# Base Case
if(root == None or
root.right == None):
return root
# Recur for list on right
root.right =
self.flatten(root.right)
# Now merge
root =
self.merge(root, root.right)
# Return the root
# It will be in turn merged with
# its left
return root
# Driver code
L = LinkedList()
'''
Let us create the following linked list
5 -> 10 -> 19 -> 28
| | | |
V V V V
7 20 22 35
| | |
V V V
8 50 40
| |
V V
30 45
'''
L.head = L.push(L.head, 30);
L.head = L.push(L.head, 8);
L.head = L.push(L.head, 7);
L.head = L.push(L.head, 5);
L.head.right =
L.push(L.head.right, 20);
L.head.right =
L.push(L.head.right, 10);
L.head.right.right =
L.push(L.head.right.right, 50);
L.head.right.right =
L.push(L.head.right.right, 22);
L.head.right.right =
L.push(L.head.right.right, 19);
L.head.right.right.right =
L.push(L.head.right.right.right, 45);
L.head.right.right.right =
L.push(L.head.right.right.right, 40);
L.head.right.right.right =
L.push(L.head.right.right.right, 35);
L.head.right.right.right =
L.push(L.head.right.right.right, 20);
# Flatten the list
L.head = L.flatten(L.head);
L.printList()
# This code is contributed by maheshwaripiyush9
输出:
5 7 8 10 19 20 20 22 30 35 40 45 50
有关详细信息,请参阅有关扁平化链接列表的完整文章!