力扣算法:回文链表

力扣算法:回文链表

  • 一、力扣算法:回文链表
    • 1、问题
    • 3、思路
    • 4、解题代码
    • 5、时间与空间复杂度
  • 备注

一、力扣算法:回文链表

1、问题

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

示例1:

输入: 1->2
输出: false

示例2:

输入: 1->2->2->1
输出: true

列表的概要讲述

有两种常用的列表实现,分别为数组列表和链表。如果我们想在列表中存储值,它们是如何实现的呢?

  • 数组列表底层是使用数组存储值,我们可以通过索引在 O(1) 的时间访问列表任何位置的值,这是由基于内存寻址的方式。
  • 链表存储的是称为节点的对象,每个节点保存一个值和指向下一个节点的指针。访问某个特定索引的节点需要 O(n) 的时间,因为要通过指针获取到下一个位置的节点。

3、思路

  1. 复制链表值到数组列表中。
  2. 构造一个列表的反向副本,比较两个列表是否相等,相等则返回True,否则返回False。

4、解题代码

#Definition for singly-linked list.
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

class Solution:
    def isPalindrome(self, head: ListNode) -> bool:
        vals = []
        current_node = head
        while current_node is not None:
            vals.append(current_node.val)
            current_node = current_node.next
        return vals == vals[::-1]

if __name__ == "__main__":

    head = ListNode(1)
    head.next = ListNode(2)
    # head.next.next = ListNode(2)
    # head.next.next.next = ListNode(1)

    solution = Solution()
    print(solution.isPalindrome(head))

5、时间与空间复杂度

时间复杂度:O(n),其中 n 指的是链表的元素个数。

第一步: 遍历链表并将值复制到数组中,O(n)。
第二步:双指针判断是否为回文,执行了 O(n/2) 次的判断,即 O(n)。
总的时间复杂度:O(2n)=O(n)。

空间复杂度:O(n),其中 n 指的是链表的元素个数,我们使用了一个数组列表存放链表的元素值。

备注

转载:

进阶
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?详见LeetCode-Solution
https://leetcode-cn.com/problems/palindrome-linked-list/solution/hui-wen-lian-biao-by-leetcode-solution/

你可能感兴趣的:(力扣算法,leetcode,链表,算法)