程序员面试金典(LeetCode)-面试题02.06(回文链表)

    技术2022-07-10  150

    链表求和

    题目描述 算法思想 解决问题,一个比较简单的方法是,将链表中的值取出然后放入列表,这样就很好判断,本文不再赘述。

    这里想分享一个反转链表的方法,以解决时间O(n),空间O(1)的进阶问题。本意就是想通过两个指针,然后从链表的中间位置反向遍历链表,判断是否是回文。其具体操作有以下几个步骤。

    1、首先,需要利用快慢指针,将慢指针定义在中间位置,当然如果链表长度是奇数,慢指针就刚好在中间位置;如果是偶数,则慢指针就在中间两个节点中的前一个。这里需要通过快指针最后停留的位置,来判断链表长度是奇数还是偶数。

    2、然后,以慢指针为基准,反转慢指针以前的链表。

    3、设立两个位置指针,分别于中间位置,一次遍历各自链表,进行比较。如果,链表长度为奇数,则中间元素不需要比较。

    代码实现

    # 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: if (head == None or head.next == None): return True p = q = head tag = 0 while q and q.next: if (q.next == None):#长度为奇数 tag = 0 break if (q.next.next == None):#长度为偶数 tag = 1 break q = q.next.next p = p.next k = p q = p.next #翻转链表 p = head pnext = p.next pre = p p.next = None while p != k: p = pnext pnext = p.next p.next = pre pre = p #如果链表长度为奇数,则中间元素不需要比较 if (tag == 0): p = p.next while q and p: if (q.val != p.val): return False p, q = p.next, q.next return True
    Processed: 0.010, SQL: 9