问答题 6.  给定一个有序链表,其中每个结点也表示一个有序链表,结点包含两个类型的指针:
    (1)指向主链表中下一个结点的指针(在下面的代码中称为“正确”指针)
    (2)指向此结点头的链表(在下面的代码中称之为“down”指针)。
    所有链表都被排序。请参见以下示例:
   
【正确答案】本题的主要思路为使用归并排序中的合并操作,使用归并的方法把这些链表来逐个归并。具体而言,可以使用递归的方法,递归地合并已经扁平化的链表与当前的链表。在实现的过程可以使用down指针来存储扁平化处理后的链表。实现代码如下:
   class Node:
   def __init__(self,data):
   self.data=data
   #self.next=None
   self.right=None
   self.down=None
   #self.head=None
   
   class MergeList:
   def __init__(self):
   self.head=None
   #用来合并两个有序的链表*
   def merge(self,a,b):
   #如果有其中一个链表为空,直接返回另外一个链表
   if a==None:
   return b
   if b==None:
   return a
   #把两个链表头中较小的结点赋值给result
   if a.data<b.data:
   result=a
   result.down=self.merge(a.down,b)
   else:
   result=b
   result.down=self.merge(a, b.down)
   return result
   #把链表扁平化处理
   def flatten(self,root):
   if root==None or root.right==None:
   return root
   #递归处理root.right链表
   root.right=self.flatten(root.right)
   #把root结点对应的链表与右边的链表合并
   root=self.merge(root, root.right)
   return root
   #把data插入到链表头
   def insert(self,head_ref,data):
   new_node=Node(data)
   new_node.down=head_ref
   head_ref=new_node
   #返回新的表头结点
   return head_ref
   def printList(self):
   temp=self.head
   while temp!=None:
   print temp.data,
   temp=temp.down
   print '\n'
   if __name__=="__main__":
   L=MergeList()
   #构造链表
   L.head=L.insert(L.head, 31)
   L.head=L.insert(L.head, 8)
   L.head=L.insert(L.head, 6)
   L.head=L.insert(L.head, 3)
   L.head.right=L.insert(L.head.right, 21)
   L.head.right=L.insert(L.head.right, 11)
   L.head.right.right=L.insert(L.head.right.right, 50)
   L.head.right.right=L.insert(L.head.right.right, 22)
   L.head.right.right=L.insert(L.head.right.right, 15)
   L.head.right.right.right=L.insert(L.head.right.right.right, 55)
   L.head.right.right.right=L.insert(L.head.right.right.right, 40)
   L.head.right.right.right=L.insert(L.head.right.right.right, 39)
   L.head.right.right.right=L.insert(L.head.right.right.right, 30)
   #扇平化链表
   L.head=L.flatten(L.head)
   L.printList()
   程序的运行结果为:
   3 6 8 11 15 21 22 30 31 39 40 50 55
【答案解析】[考点] 如何展开链接列表