struct Node {
int value;
Node* next;
};
bool propSubset(Node* p, Node* q) {
if(q == nullptr) return false;
if(p == nullptr && q != nullptr) return true;
if(p->value < q->value) return false;
if(p->value > q->value) return propSubset(p, q->next);
return propSubset(p->next, q->next);
}
p是q的子集,如果
p和q都按升序排序。
这是我得到的全部,但它不适用于p = {2,4},q = {1,2,3,4}的情况 我怎样才能改善这个?感谢
答案 0 :(得分:1)
迭代解决方案可能会更好。给定任意长度的列表,您不希望存在耗尽堆栈空间的风险。
因为q中的非交叉元素可以随机分布,所以尺寸因子起作用。
您可能希望重构代码,例如:
bool propSubset(Node* p, Node* q) {
int len_q = length(q); // assuming you have length function.
if (length(p) >= len_q) return false;
for(int i=0; i < len_q && p != nullptr; ++i) {
if (p->value == q->value) p = p->next;
if (p->value < q->value) return false; // That particular value in p is not in q.
q = q->next;
}
if (p == nullptr) return true;
return false;
}
答案 1 :(得分:0)
你假设不在p中的q元素总是在列表的最后。您需要考虑额外元素可以在列表中的任何位置,而不仅仅是列表的末尾,您将走在正确的道路上。