问题:
给定三个链接列表,例如
a
,b
和c
,从每个列表中找到一个节点,使得节点值的总和等于给定数量。例如,如果三个链接列表为
12->6->29
,23->5->8
和90->20->59
,并且给定的数字为101
,则输出应为三元组{{1 }}
在GeeksforGeeks上描述"6 5 90"
解决方案:(转述)
O(n²)
和b
分别使用合并排序按升序和降序排序。然后,对于每对c
和b
(c
的第一个元素和b
的第一个元素形成一对,依此类推),我们检查{的所有值{1}}。
我不知道实现,只是算法。该算法如何提供正确的解决方案?
答案 0 :(得分:1)
该算法基本上将3-SUM问题转换为2和问题。
您有列表b按升序排序,c按降序排序。
对于a中的每个ai元素,你必须检查b&中是否有一对(bj,ck)。 c这样:
bj + ck = SUM - ai
这可以通过遍历列表b& c同时。
为列表b&保留一个指针。 c(比如p& q)。
If (*p + *q == SUM - ai)
return with success.
If (*p + *q < SUM - ai)
p = p->next
If (*p + *q > SUM - ai)
q = q->next
这个想法是p指向列表b中的最低元素,q指向c中的最高元素。因此,如果总和太小,则需要考虑b中的较大数字,如果它太大,则需要考虑c中较小的数字。