然后set.contains()这个方法查找的应该是引用吧,不是节点里的val值

有点不太清楚这样做为什么会报错,然后set.contains()这个方法查找的应该是引用吧,也就是地址,不是节点里的val值,然后是哪里出现了逻辑错误呢?

img

img



```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类中,默认情况下没有重写hashCodeequals方法。因此,当调用set.contains方法时,比较的是ListNode对象的引用是否相等,而不是比较节点的val值是否相等。

解决这个问题的方法是,在ListNode类中重写hashCodeequals方法,使得HashSet可以根据节点的val值来判断两个节点是否相等。具体做法如下:

  1. ListNode类中添加hashCode方法,使用节点的val值计算哈希码。可根据实际情况选择合适的哈希码计算方式。
  2. 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;
}
  1. 修改代码中的HashSet的声明部分,指定使用重写的hashCodeequals方法进行比较:
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值进行比较,而不再是比较引用。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^