You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift实现相交链表算法返回错误结果的排查求助

Swift版相交链表问题的排查与解决提示

你猜的完全没错,问题确实出在ha != hb的对象比较环节,核心原因是你自定义的Equatable实现干扰了引用类型的实例判断逻辑,具体来说有两个关键问题:

1. 自定义Equatable的逻辑错误

你写的==方法里有个明显的笔误,而且逻辑方向也不对:

public static func == (lhs: ListNode, rhs: ListNode) -> Bool {
    return lhs.val == rhs.val && rhs.next == rhs.next // 这里rhs.next和自己比永远为true
}

就算修正笔误改成lhs.next == rhs.next,这个逻辑依然不适合当前场景——相交链表的判断需要的是两个指针指向同一个内存实例,而不是节点的值和next指针内容相等。你的实现把比较逻辑变成了"值相等即相等",这就导致当ha走到hA的Node(1)、hb走到hB的Node(1)时,因为两个节点val都是1,会被判定为相等,循环提前终止,所以返回了错误的节点。

2. 正确的比较方式

解决这个问题有两种简单的方案:

方案一:移除Equatable实现,使用恒等运算符判断

Swift中类是引用类型,专门提供了===(恒等运算符)来判断两个引用是否指向同一个实例。你可以删掉整个Equatable的实现,然后修改循环的判断条件:

while ha !== hb { // 用!==判断是否不是同一个实例
    ha = ha == nil ? headB : ha?.next
    hb = hb == nil ? headA : hb?.next
}

方案二:修正Equatable的实现逻辑

如果一定要保留Equatable协议的实现,把==方法改成判断引用相等即可:

public static func == (lhs: ListNode, rhs: ListNode) -> Bool {
    return lhs === rhs // 直接判断是否为同一个实例
}

这两种方案都能让你的代码正确识别到相交的node8实例,返回预期结果。

内容的提问来源于stack exchange,提问作者Zhou Haibo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 05:08:09