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

        
    }
}
相关推荐
To_OC15 小时前
LC 128 最长连续序列:别上来就排序,O (n) 解法才是这题的灵魂
javascript·算法·leetcode
05Kevin1 天前
lk每日冒险题--数据结构6.27
算法
To_OC2 天前
从一次栈溢出报错说起,我把递归彻底扒明白了
javascript·算法·程序员
千纸鹤安安2 天前
千问Qwen-AgentWorld来了:一个语言模型搞定七大Agent场景,GPT-5.4都输了
算法
七牛开发者2 天前
MCP 到底是什么?为什么 Agent 都想接上它
算法·aigc·agent
kisshyshy2 天前
从递归到迭代,一文吃透二叉树的核心知识与 JavaScript 实现
javascript·算法·代码规范
To_OC3 天前
LC 49 字母异位词分组:想到哈希表很简单,选对 key 才是精髓
javascript·算法·leetcode