题目: 环形链表
给定一个链表,判断链表中是否有环。
进阶
你能否不使用额外空间解决此题?
方案:
可以转化为一个追击问题
前后双指针,slow走一步,fast走两步,如果有环存在,一定会相遇的。
代码:
/**
* Definition for singly-linked list.
* public class ListNode {
* public var val: Int
* public var next: ListNode?
* public init(_ val: Int) {
* self.val = val
* self.next = nil
* }
* }
*/
extension ListNode: Equatable {
public static func == (lhs: ListNode, rhs: ListNode) -> Bool {
return Unmanaged.passUnretained(lhs).toOpaque() == Unmanaged.passUnretained(rhs).toOpaque()
}
}
class Solution {
func hasCycle(_ head: ListNode?) -> Bool {
if (head == nil || head?.next == nil) {
return false
}
var slow = head
var fast = head?.next
while(slow != fast) {
if (fast == nil || fast?.next == nil) {
return false
}
slow = slow?.next
fast = fast?.next?.next
}
return true
}
}