美文网首页
剑指 Offer II 023. 两个链表的第一个重合节点

剑指 Offer II 023. 两个链表的第一个重合节点

作者: 邦_ | 来源:发表于2022-04-24 09:01 被阅读0次

用个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
   
    }

相关文章

网友评论

      本文标题:剑指 Offer II 023. 两个链表的第一个重合节点

      本文链接:https://www.haomeiwen.com/subject/kxxxertx.html