力扣hot100 - 234、回文链表

最近学得心好累,很烦,唯一能坚持下来的就是一天一道算法一篇博客了。

有没有真人给我点个赞啊!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

题目思路一:将值复制到数组中然后用双指针法

左指针右移,右指针左移,不断判断是否相同即可。

时间复杂度为o(1)空间复杂度为o(n)

不太建议该方法,实际上相当于在数组上的判断。

思路二:反转后半链表后双指针

首先我们要先找到链表的中间,然后将中间及其后面部分反转。

找到链表中间--快慢指针法:快慢指针同期点,慢指针走一步,块指针走两步,在快指针及快指针下一个元素不为空的情况下,不断往前走;最后慢指针停下来的地方就是链表中间的地方(如果是偶数个,那就是中间偏右)。

反转后半链表:见我上篇文章--反转链表

java 复制代码
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public boolean isPalindrome(ListNode head) {

        ListNode slow = head;//慢指针
        ListNode quick = head;//块指针
        while(quick != null && quick.next!= null){
            slow = slow.next;
            quick = quick.next.next;
        }
        ListNode headb =  reverse(slow);
        ListNode heada = head;
        while(heada != null && headb != null){
            if(heada.val != headb.val)return false;

            heada = heada.next;
            headb = headb.next;
        }

        return true;
        
        
    }

    //反转链表
    public ListNode reverse(ListNode head){
        ListNode p = null;
        ListNode pp = head;
        while(pp != null){
            ListNode ppp = pp.next;
            pp.next = p;
            p = pp;
            pp = ppp;
        }
        return p;

        
    }
}
相关推荐
初心未改HD5 分钟前
深度学习之MLP与反向传播算法详解
人工智能·深度学习·算法
刀法如飞7 分钟前
【Go 字符串查找的 20 种实现方式,用不同思路解决问题】
人工智能·算法·go
技术小黑2 小时前
CNN算法实战系列03 | DenseNet121算法实战与解析
pytorch·深度学习·算法·cnn
wearegogog1232 小时前
三电平SVPWM逆变器仿真指南
单片机·算法
笨笨饿3 小时前
74_SysTick滴答定时器中断
c语言·开发语言·人工智能·单片机·嵌入式硬件·算法·学习方法
pkowner3 小时前
若依分页问题及解决方法
java·前端·算法
呃呃本4 小时前
算法题(栈)
算法
通信小呆呆4 小时前
基于 ADMM-MFOCUSS 的捷变频雷达扩展目标稀疏重构原理
算法·重构·信息与通信·信号处理·雷达
橙淮4 小时前
Java数组与链表:特性对比与应用场景
数据结构·算法