我基本上完成了一个黑客等级练习,如果列表完全相等则返回1意味着两个列表中的节点数相同且节点中的所有值也相等。否则你返回0。
这是我写的方法,由于某种原因,我一直在测试用例失败,我不知道为什么。我在书中记下了一些测试用例并进行了手工跟踪,但似乎无法弄清楚原因。
int CompareLists(Node headA, Node headB) {
// This is a "method-only" submission.
// You only need to complete this method
Node temp = headA;
Node temp2 = headB;
int equal = 1;
if(temp == null && temp2 == null){
equal = 1;
}
else if((temp == null && temp2 != null) || (temp!=null && temp2 == null)){
equal = 0;
}
else{
while(temp.next != null){
if(temp.data != temp2.data || temp2.next == null){
equal = 0;
break;
}
temp = temp.next;
temp2 = temp2.next;
}
if(temp2.next != null){
equal = 0;
}
}
return equal;
}
是的,我在网上找到了很多解决方案,但我更好奇为什么我的解决方案无效。
答案 0 :(得分:1)
代码
while(temp.next != null){
if(temp.data != temp2.data || temp2.next == null){
equal = 0;
break;
}
temp = temp.next;
temp2 = temp2.next;
}
if(temp2.next != null){
equal = 0;
}
永远不会将第一个列表的最后一个元素与第二个列表的相应元素进行比较,因为您的循环会提前停止。试试这个:
while(temp != null){
if(temp2 == null || temp.data != temp2.data){
equal = 0;
break;
}
temp = temp.next;
temp2 = temp2.next;
}
if(temp2 != null){
equal = 0;
}
使用temp != null
作为循环条件确保,我们还检查最后一个元素。检查temp2.next == null
已经进行了相同的调整,现在是temp2 == null
。此检查必须在比较data
之前完成,以避免在NullPointerException
比较期间data
。
我个人会更喜欢写这个部分:
while(temp != null && temp2 != null){
if(temp.data.equals(temp2.data)){
return false;
}
temp = temp.next;
temp2 = temp2.next;
}
return temp == temp2;
我认为它更容易理解,因为它是对称的。 equals
的使用确保我们比较有效负载的实际内容,而不仅仅是引用。我还使用boolean
作为返回类型。
答案 1 :(得分:0)
您可以使用递归功能。
public boolean isIdenticalRecursive(Node a, Node b) {
if (a == null && b == null) {
return true;
}
if (a.data != b.data)
return false;
return isIdenticalRecursive(a.next, b.next);
}
希望这会有所帮助!! :)
答案 2 :(得分:0)
这有效:
int CompareLists(Node headA, Node headB) {
if ((headA == null)^(headB == null))
return false;
if ((headA == null) && (headB == null))
return true;
if (headA.data != headB.data)
return false;
return CompareLists(headA.next, headB.next);
}
答案 3 :(得分:0)
最干净的方式:
static boolean compareLists(SinglyLinkedListNode head1, SinglyLinkedListNode head2) {
while(head1 != null && head2 != null && head1.data == head2.data) {
head1 = head1.next;
head2 = head2.next;
}
return head1 == head2;
}