Swift - LeetCode - 回文链表

作者: 依赖糊涂 | 来源:发表于2019-03-11 14:24 被阅读4次

    题目

    回文链表

    问题:

    请判断一个链表是否为回文链表。

    进阶:

    你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

    示例:

    示例 1:
         
    输入: 1->2
    输出: false
    
    示例 2:
    
    输入: 1->2->2->1
    输出: true
    
    

    解题思路:

    我们首先想到的思路是通过建立一个list,然后将链表中的数存进去,然后判断这个list是否回文。但是这样做的空间复杂度是O(n),显然无法满足空间复杂度O(1)的需求。我们可以建立快慢指针,通过这两个指针获得两个列表,

    代码:
    /**
    public class SingNode {
        public var value : Int
        public var nextNode: SingNode?
        
        public init(value:Int) {
            self.value = value
        }
    }
    
    extension SingNode : CustomStringConvertible {
        public var description: String {
            var string = "\(value)"
            var node = self.nextNode
            
            while node != nil {
                string = string + " -- " + "\(node!.value)"
                node = node?.nextNode
            }
            return string
        }
    }
     **/
          
    func isPalindrome(_ l1:SingNode?) -> Bool {
            if l1 == nil || l1?.nextNode == nil {
                return false
            }
            
            var fast = l1
            var slow = l1
            var nodeArr:[Int] = [Int]()
            nodeArr.append(l1!.value)
            while fast?.nextNode != nil && fast?.nextNode?.nextNode != nil {
                slow = slow?.nextNode
                fast = fast?.nextNode?.nextNode
                nodeArr.append(slow!.value)
            }
            
            while slow?.nextNode != nil {
                if nodeArr.count != 0 {
                    if nodeArr.removeLast() != slow?.nextNode?.value {
                        return false
                    }
                } else {
                    return false
                }
                slow = slow?.nextNode
            }
            return true
        }
        
    

    相关文章

      网友评论

        本文标题:Swift - LeetCode - 回文链表

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