LeetCode 234. 回文链表
题目描述
请判断一个链表是否为回文链表。
示例 1:
输入:head = [1,2,2,1]
输出:true
示例 2:
输入:head = [1,2]
输出:false
进阶:
你能否用 O(n)
时间复杂度和 O(1)
空间复杂度解决此题?
Java 实现解法
方法:快慢指针 + 反转链表
/*** Definition for singly-linked list.* class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/
class Solution {public boolean isPalindrome(ListNode head) {if (head == null || head.next == null) {return true;}ListNode fast = head;ListNode slow = head;// 寻找链表中间节点while (fast.next != null && fast.next.next != null) {fast = fast.next.next;slow = slow.next;}// 反转后半部分链表ListNode secondHead = reverse(slow.next);slow.next = null;// 比较前半部分和反转后的后半部分ListNode p1 = head;ListNode p2 = secondHead;while (p2 != null) {if (p1.val != p2.val) {return false;}p1 = p1.next;p2 = p2.next;}return true;}private ListNode reverse(ListNode head) {ListNode prev = null;ListNode curr = head;while (curr != null) {ListNode nextTemp = curr.next;curr.next = prev;prev = curr;curr = nextTemp;}return prev;}
}
解题思路
- 寻找中间节点:使用快慢指针法,
fast
指针每次移动两步,slow
指针每次移动一步。当fast
指针到达链表末尾时,slow
指针将位于中间节点。 - 反转后半部分链表:从中间节点的下一个节点开始,反转链表的后半部分。
- 比较两个链表:从头节点开始,同时遍历前半部分和反转后的后半部分,比较对应节点的值是否相等。如果所有节点的值都相等,则链表是回文的。
这种方法的时间复杂度是 O(n)
,空间复杂度是 O(1)
,符合题目的进阶要求。通过原地反转链表和比较,避免了使用额外的空间来存储链表的值。
注:来源leetcode网站