编写一个接受两个列表的sateredmerge()函数,每个列表在序列中排序,然后将两个列表合并到垃圾列表中。SortedMerge()应返回新列表。应该通过缝制新列表。前两个列表的节点。
例如,如果第一个链接列表a为5-> 10-> 15,另一个链接列表b为2-> 3-> 20,则STARTEDMERGE()应将指针返回到合并的链列表2-> 5->10-> 15-> 20。
有很多情况需要处理:A或B可能是空的。在处理过程中,可以首先使用A或B,并且结果列表开始为空。在体验“ A”和“ B”时,构造它的问题就会向上。
这里的策略使用临时虚拟节点作为结果列表。指针尾部总是指向结果列表中的最后一个节点,因此易于添加新节点。
当结果列表为空时,虚拟节点在尾部提供了一个初始点。此虚拟节点是有效的,因为它仅是临时的,并且在堆栈中分配。它到尾巴。当我们完成时,结果是在虚拟中。
以下是上述方法的实现:
输出:
该解决方案与上述非常相似,但是它避免了使用虚拟节点的使用。它立即维护一个结构节点指针LastPtrref,它总是指向结果列表的最后一个指针。此情况与虚拟节点-IT求解相同的情况-IT当结果列表为空时会处理。如果您尝试在尾部构建列表,则可以使用虚拟节点或结构节点“参考”策略(相关详细信息,请参见第1节)。
合并是一个良好的递归问题之一,其中递归解决方案代码比迭代代码清晰得多。但是,您可能不想将递归版本用于生产代码,因为它将使用与列表长度成正比的堆栈空间。
时间的复杂性:因为我们已经完全旅行了两个列表。因此,时间复杂性为O(m+n),其中m和n是要合并的两个列表的长度。
这个想法包括第一个逆转列表。逆转后,它遍历两个列表直到结束,然后比较两个列表的节点,并在结果列表的开头插入具有很大值的节点。这样,我们将以这样的方式获得结果列表。增加。
以下是上述解决方案的实施。
输出:
时间的复杂性:因为我们已经完全旅行了两个列表。因此,时间复杂性为O(m+n),其中m和n是要合并的两个列表的长度。
