力扣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;

        
    }
}
相关推荐
飞Link3 小时前
什么是 AirSim?一文读懂无人机仿真平台
python·算法·无人机
一去不复返的通信er5 小时前
贪心算法-合并区间(LeetCode 56)
算法·leetcode·贪心算法
Shaoshing6 小时前
LeetCode100 49. 字母异位词分组
java·算法
YFJ_mily6 小时前
第二届区块链技术与基础模型国际学术会议(BTFM2027)
算法·区块链·能源·智能系统·rdlink研发家·机器人自动化
汤姆宝库7 小时前
收官深拆:第一性原理、产业电网与未来推演
大数据·人工智能·算法
moshuying9 小时前
块扩散 + GDN 改造:Clover 把「并行生成」塞进了 Agent 的长上下文里
前端·算法
没落之王9 小时前
历史系统建模:宋初太祖太宗「再立天庭」秩序重构推演
人工智能·算法·重构
INGNIGHT9 小时前
91 · 最小调整代价(序列dp)
数据结构·算法·leetcode
moshuying9 小时前
扩散模型开始写代码、开网页了:350 亿参数,速度比 Jev 快一倍
前端·算法