编写一个函数,检查输入的链表是否是回文的。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
思路:题目easy,只是想存下时空复杂度最优下的思路。
首先我们可以通过快慢指针找到整个链表的中点,之后我们根据最优翻转链表的算法翻转链表的后半段,最后追位比较判断是否是回文串即可。
class Solution {
public boolean isPalindrome(ListNode head) {
if (head == null)
return true;
ListNode midNode = findMidNode(head);
ListNode secondHalfHead = reverseList(midNode.next);
boolean isPalindRome = true;
while (isPalindRome && secondHalfHead != null) {
if (head.val != secondHalfHead.val)
isPalindRome = false;
head = head.next;
secondHalfHead = secondHalfHead.next;
}
return isPalindRome;
}
private ListNode reverseList(ListNode head) {
ListNode cur = head;
ListNode prev = null;
while (cur != null) {
ListNode nextTemp = cur.next;
cur.next = prev;
prev = cur;
cur = nextTemp;
}
return prev;
}
private ListNode findMidNode(ListNode head) {
ListNode fast = head;
ListNode slow = head;
while (fast.next != null && fast.next.next != null) {
fast = fast.next.next;
slow = slow.next;
}
return slow;
}
}