我们必须检查两个给定的链接列表是否包含相同的数据。在这种情况下的顺序无关紧要,这意味着{1,3,2}
和{2,1,3}
是相同的。我认为我们应该引入一个新变量counter=0
并执行以下过程:
while(node1->next!=NULL)
{
int value=node1->value;
if(contains(node2,value)){
counter++;
}
node1=node1->next;
if(counter== number of elements in node 1)
return true;
else return false;
}
另一种方法是对两个列表进行排序并逐节点地进行比较。哪一个是最佳的?在第一种情况下,它需要O(n ^ 2)次操作,而在第二种情况下,如Nlog(N)+ O(N),(如果我们使用合并排序)。我的想法是对的吗?或者还有另一种最佳方法吗?
答案 0 :(得分:2)
在你发布的两种方法中,第二种方法更好。但我建议你hashing
。
首先哈希第一个链表。
在散列时检查第二个列表。
这样,它可以在O(n)时间内完成。
答案 1 :(得分:2)
如果链接列表中的值允许,您可以使用第一个链接的值创建直方图,然后迭代第二个列表,逐渐减少直方图条目。如果最后直方图只包含零,则它们是相同的。
因此,例如,如果list1包含{1,3,4,2,4},则直方图将是(从零开始)[0,1,1,1,2]。
然后如果list2包含{1,3,2,4},则在递减后直方图将是[0,0,0,0,1]。
运行时间为O(m + n)
答案 2 :(得分:1)
这个解决方案需要相同的时间复杂度,但仍然会好一点!
{
while(node1->next != NULL)
{
if(!contains(node2, node1->value)){
return false;
}
node1 = node1->next;
}
return true;
}
答案 3 :(得分:0)
您可以将数字打印到字符串中,然后对字符串进行排序,以便所有内容都按照正确的顺序
编辑:这只是一个建议,你的其他方式更好
答案 4 :(得分:0)
这是一个绝对有效的递归解决方案......
int CompareLists(Node *headA, Node* headB)
{
if (headA == NULL && headB == NULL)
{ return 1; }
if (headA == NULL && headB != NULL)
{ return 0; }
if (headB != NULL && headB == NULL)
{ return 0; }
if (headA->data != headB->data)
{ return 0; }
return CompareLists(headA->next, headB->next);
}