![Java程序员面试算法宝典](https://wfqqreader-1252317822.image.myqcloud.com/cover/248/26268248/b_26268248.jpg)
上QQ阅读APP看书,第一时间看更新
1.12 如何展开链接列表
【出自TX面试题】
难度系数:★★★★☆
被考察系数:★★★☆☆
题目描述:
给定一个有序链表,其中每个结点也表示一个有序链表,结点包含两个类型的指针:
1)指向主链表中下一个结点的指针(在下面的代码中称为“正确”指针)。
2)指向此结点头的链表(在下面的代码中称之为“down”指针)。
所有链表都被排序。参见以下示例:
![](https://epubservercos.yuewen.com/71257F/14700476205665206/epubprivate/OEBPS/Images/62_03.jpg?sign=1738815069-W9ovvswFEmQ5gzzFNIBKkEIzRj03NwoB-0-caca63a5965e3f519325e43877b52534)
![](https://epubservercos.yuewen.com/71257F/14700476205665206/epubprivate/OEBPS/Images/63_01.jpg?sign=1738815069-Fdzy3yxaJqiFVMEIBvd9mh7nhBPys2V7-0-6164a51ec2b2d5480e5cdd7302c1bdb3)
实现一个函数flatten(),该函数用来将链表扁平化成单个链表,扁平化的链表也应该被排序。例如,对于上述输入链表,输出链表应为3→6→8→11→15→21→22→30→31→39→40→45→50。
分析与解答:
本题的主要思路为:使用归并排序中的合并操作,使用归并的方法把这些链表来逐个归并。具体而言,可以使用递归的方法,递归地合并已经扁平化的链表与当前的链表。在实现的过程可以使用down指针来存储扁平化处理后的链表。实现代码如下:
![](https://epubservercos.yuewen.com/71257F/14700476205665206/epubprivate/OEBPS/Images/63_02.jpg?sign=1738815069-484UIAJmr7hBwpP9s2L6IHqahGrWj9P3-0-6800e760bbc49c419ac07cea4151a099)
![](https://epubservercos.yuewen.com/71257F/14700476205665206/epubprivate/OEBPS/Images/64_01.jpg?sign=1738815069-rhkjTgxm5Pz1kdn5FOvCZDIwRJzSQXgN-0-540dbac59260a0cde7d45d5c01bec8e1)
![](https://epubservercos.yuewen.com/71257F/14700476205665206/epubprivate/OEBPS/Images/65_01.jpg?sign=1738815069-USBcATjF4nx0KbtQtVAxWVfgZypgFn9B-0-1a5842e44681eab901e5a3ab58ad8c27)
程序运行结果为
![](https://epubservercos.yuewen.com/71257F/14700476205665206/epubprivate/OEBPS/Images/65_02.jpg?sign=1738815069-O5WC24L6x4oG9ylIZuqLV99c1INZBbPl-0-33db297016bf576940b34df9b6c5de45)