剑指 Offer II 027. 回文链表
1.题目分析
以快慢指针方法为例——空间复杂度为1,时间复杂度为N
- 1.mid指针每次走1步,fast指针每次走2步,当fast到最后时,mid正好走到链表中间(链表节点数奇偶先不谈)
- 2.反转mid之后的链表,返回头节点rev;
- 3.slow、rev按照回文的规则进行比较,看整条串是否为回文串。
2.代码
快慢指针
class Solution {
public boolean isPalindrome(ListNode head) {
ListNode slow = head;
ListNode mid = head;
ListNode fast = head;
while (fast!=null && fast.next!=null){
mid = mid.next;
fast = fast.next.next;
}
反转mid后的链表,并返回头节点
ListNode rev = reverse(mid);
while (slow!=null && rev!=null){
if (slow.val != rev.val)
return false;
slow = slow.next;
rev = rev.next;
}
return true;
}
反转链表
public ListNode reverse(ListNode node){
ListNode pre = null, cur = node;
while (cur != null){
ListNode next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
return pre;
}
}
附加方法:
递归后序遍历的方法进行比较,空间复杂度为N,时间复杂度为N
class Solution {
ListNode left;
public boolean isPalindrome(ListNode head) {
left = head;
return trverse(head);
}
public boolean trverse(ListNode right){
if (right==null) return true;
boolean res = trverse(right.next);
后序遍历
res = res && (left.val == right.val);
left = left.next;
return res;
}
}