用个set或者字典存储之后 遍历判断对象是否相等
这里判断的时候需要实现协议 而且构造测试用例的时候 重合部分需要用相同节点 要不到时候内存比较的时候没办法比较相等
func getIntersectionNode(_ headA: ListNode?, _ headB: ListNode?) -> ListNode? {
var hashSet = Set<ListNode>()
var current = headA
while current != nil {
hashSet.insert(current!)
current = current!.next
}
current = headB
while current != nil {
if hashSet.contains(current!) {
break
}
current = current?.next
}
return current
}
}
extension ListNode: Hashable,Equatable {
public static func == (lhs: ListNode, rhs: ListNode) -> Bool {
return lhs === rhs
}
public func hash(into hasher: inout Hasher){
hasher.combine(val)
hasher.combine(ObjectIdentifier(self))
}
双指针解法
如果两个链表长度相等 同时移动两个指针 A、B
如果相交的话 那么A、B 移动相同位置 第一次相等的节点就是相交点
如果没有相交的话 那么同时移动到nil
如果长度不一样 A可以遍历完第一个链表 B可以遍历完第二个链表
然后A指向B 第一个相等的点 就是交点
func getIntersectionNode(_ headA: ListNode?, _ headB: ListNode?) -> ListNode? {
if headA == nil || headB == nil {
return nil
}
var tempA = headA
var tempB = headB
while tempA !== tempB {
tempA = (tempA == nil) ? headB : tempA?.next
tempB = (tempB == nil) ? headA : tempB?.next
}
return tempA
}
网友评论