C++程序 找到三个链表中和等于给定数字的三元组
给定三个链表a、b和c,找到每个链表中的一个节点,使得这些节点的值的和等于给定的数字。
例如,如果三个链表分别为12->6->29、23->5->8和90->20->59,给定数字为101,则输出应为“6 5 90”。
在以下解决方案中,为了简化分析,假设所有三个链表的大小相同。以下解决方案也适用于不同大小的链表。
解决这个问题的一个简单方法是运行三个嵌套循环。外层循环从列表a中选择一个元素,中间循环从列表b中选择一个元素,内部循环从列表c中选择一个元素。内部循环还会检查a、b和c的当前节点的值的总和是否等于给定的数字。这种方法的时间复杂度将是O(n^3)。
为了将时间复杂度降至O(n*n),可以使用排序。以下是详细步骤。
1)将列表b按升序排序,将列表c按降序排序。
2)在排序b和c之后,逐一从列表a中选择一个元素,并通过遍历b和c找到该元素的配对。请参阅以下代码中的isSumSorted()。这个想法类似于3 sum问题的二次算法。
以下代码仅实现步骤2。可以通过添加合并排序代码在非排序的列表上轻松修改解决方案。
输出:
时间复杂度: 链表b和c可以使用归并排序在O(nLogn)时间内排序(参见此处)。步骤2需要O(n*n)
时间。因此,总时间复杂度为O(nlogn) + O(nlogn) + O(nn) = O(nn)。
在这种方法中,先对链表b和c进行排序,因此它们的原始顺序将丢失。如果要保留b和c的原始顺序,我们可以创建b和c的副本。