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
相关产品推荐
相关产品推荐

