image.png

解题思路 快慢指针

思想很很简单,用2个指针,一个low,一个fast,fast是low的2倍,所以可以达到2分链表的效果
,在移动指针时同时对前半部分链表进行反转。最后直接比较被分开的2个链表
因为不能改变当前slow的next,不然就无法跳到下一个元素,所以这里用pre和prepre实现指针的反转
时间复杂度:第一个循环O(n/2),第2个循环O(n/2)

  1. public boolean isPalindrome(ListNode head) {
  2. if(head==null||head.next==null)
  3. return true;
  4. ListNode slow = head,fast=head.next,pre =null,prepre=null;
  5. while (fast!=null&&fast.next!=null){
  6. pre = slow;
  7. slow=slow.next;
  8. fast=fast.next.next;
  9. pre.next=prepre;
  10. prepre=pre;
  11. }
  12. ListNode p2 = slow.next;
  13. slow.next=pre;
  14. ListNode p1=fast==null?slow.next:slow;
  15. while (p1!=null){
  16. if(p1.val != p2.val)
  17. return false;
  18. p1 = p1.next;
  19. p2 = p2.next;
  20. }
  21. return true;
  22. }