有点不太清楚这样做为什么会报错,然后set.contains()这个方法查找的应该是引用吧,也就是地址,不是节点里的val值,然后是哪里出现了逻辑错误呢?
```java
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
HashSet<ListNode> set=new HashSet<>();
while (headA!=null&&headB!=null){
if(set.contains(headA))
return headA;
if(set.contains(headB))
return headB;
set.add(headA);
set.add(headB);
if(headA!=null)
headA=headA.next;
if(headB!=null)
headB=headB.next;
}
return null;
}
你应该分别遍历A、B链表,而不是同时
【以下回答由 GPT 生成】
问题的关键在于理解HashSet
的使用。在HashSet
中,使用contains
方法来判断一个元素是否存在时,是通过调用元素的hashCode
方法和equals
方法来进行比较的。
在上述代码中,HashSet
存储的是ListNode
对象,而在ListNode
类中,默认情况下没有重写hashCode
和equals
方法。因此,当调用set.contains
方法时,比较的是ListNode
对象的引用是否相等,而不是比较节点的val
值是否相等。
解决这个问题的方法是,在ListNode
类中重写hashCode
和equals
方法,使得HashSet
可以根据节点的val
值来判断两个节点是否相等。具体做法如下:
ListNode
类中添加hashCode
方法,使用节点的val
值计算哈希码。可根据实际情况选择合适的哈希码计算方式。ListNode
类中添加equals
方法,判断两个节点的val
值是否相等。@Override
public int hashCode() {
return Objects.hash(val);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
ListNode other = (ListNode) obj;
return val == other.val;
}
HashSet
的声明部分,指定使用重写的hashCode
和equals
方法进行比较:HashSet<ListNode> set = new HashSet<>();
修改之后的代码如下:
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
HashSet<ListNode> set = new HashSet<>();
while (headA != null && headB != null) {
if (set.contains(headA))
return headA;
if (set.contains(headB))
return headB;
set.add(headA);
set.add(headB);
headA = headA.next;
headB = headB.next;
}
return null;
}
这样修改之后,set.contains
方法就会根据节点的val
值进行比较,而不再是比较引用。
【相关推荐】