目录
一、题目:
请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:输入: 1->2->2->1
输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-linked-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、解法:
1. 快慢指针,时间复杂度O(n),空间复杂度O(n/2)
代码如下:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def isPalindrome(self, head: ListNode) -> bool:
# 如果链表为空或者链表只有一个节点,则返回True。此处要注意先判断链表是否为空,后判断是否为单节点
if not head or not head.next:
return True
# 快慢指针,确定链表中点
# 初始化指针
fast = head
slow = head
# 依据快指针是否到结尾来判断中点位置,fast=1,3,5..., slow=1,2,3...
while (fast.next and fast.next.next):
fast = fast.next.next
slow = slow.next
# 如果链表长度是偶数,快指针再走一步到链表尾部
if fast.next:
fast = fast.next
# 创建额外空间,依次将slow后的后半截链表加入列表
l = []
while slow.next:
l.append(slow.next.val)
slow = slow.next
# 逆序比较列表l中元素与链表前半部分元素是否相同
for i in range(len(l)-1, -1, -1):
if l[i] != head.val:
return False
head = head.next
return True
2. 后续补上一个空间复杂度O(1)的解法。
总结
快慢指针可以用于定位链表的中点。