刷题笔记-234. 回文链表

78 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情

一、题目描述:

234. 回文链表 - 力扣(LeetCode)

给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false

示例 1:

image.png

输入:head = [1,2,2,1]
输出:true

示例 2:

image.png

输入:head = [1,2]
输出:false

提示:

  • 链表中节点数目在范围[1, 10^5] 内
  • 0 <= Node.val <= 9

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

二、思路分析:

和数组的回文判定不同,链表无法直接用切片指针遍历,因此需要:

  1. 找到链表的中点
  2. 将中点后的链表翻转
  3. 比较两段链表,进行回文判定
  4. 最好再将被反转的链表恢复,这样才是工程中的做法
  5. 特别注意:在被该函数调用时,该链表不能被其他线程调用

三、AC 代码:

# 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:
        if not head:        #考虑特别情况
            return False
        if not head.next:
            return True

        fast=head
        slow=head
        while True:     #快慢指针找到链表的中点
            if fast and fast.next:
                fast=fast.next.next
                slow=slow.next
            else:
                break
        
        mid=slow

        def reverse_linklist(head): #中点后的链表翻转
            l=head
            dummy_node=None
            while head:
                tmp=head.next
                head.next=dummy_node
                dummy_node=head
                head=tmp
            return dummy_node

        right=reverse_linklist(mid)
        left=head

        while left!=right and left and right:   #比较前后两段链表,实现回文判定
            if left.val!=right.val:
                return False
            left=left.next
            right=right.next     
        return True

参考

234. Palindrome Linked List 快慢指针翻转 - 回文链表 - 力扣(LeetCode)

思路1: 判断是否是回文链表,如果逆序返回元素和正序返回元素的值相等,则说明是回文链表,否则不是。 - 回文链表 - 力扣(LeetCode)