A.每日一题:234. 回文链表

题目链接:234. 回文链表(简单)

算法原理:

本题与 A.每日一题:876. 链表的中间结点+2130. 链表最大孪生和 中的 2130题基本一模一样,只是在部分地方有修改,这里就不过多赘述了,大家可以自行参考上面这篇博客~~

解法一:双指针+顺序表

7ms击败35.92%

时间复杂度O(N)

解法二:递归

17ms击败6.07%

时间复杂度O(N)

解法三:迭代

5ms击败59.18%

时间复杂度O(N)

Java代码:

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 {
    //234. 回文链表
    //解法一:双指针+顺序表
    public boolean isPalindrome(ListNode head) {
        List<Integer> list=new ArrayList<>();
        ListNode cur=head;
        while(cur!=null){
            list.add(cur.val);
            cur=cur.next;
        }
        int left=0,right=list.size()-1;
        while(left<right){
            if(list.get(left)!=list.get(right)) return false;
            left++;right--;
        }
        return true;
    }
}
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 {
    //234. 回文链表
    //解法二:递归
    private ListNode left;
    public boolean isPalindrome(ListNode head) {
        left=head;
        return dfs(head);
    }
    private boolean dfs(ListNode right){
        //递:先把right移到链表末尾
        if(right.next!=null&&!dfs(right.next)) return false;
        //归:从右到左遍历链表
        if(left.val!=right.val) return false;
        //left 往右走
        left=left.next;
        //归:right会往左走
        return true;
    }

}
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 {
    //234. 回文链表
    //解法三:递归
    public boolean isPalindrome(ListNode head) {
        ListNode mid=middleNode(head);
        ListNode head2=reverseList(mid);
        while(head2!=null){
            if(head.val!=head2.val) return false;
            head=head.next;
            head2=head2.next;
        }
        return true;
    }
    //876.链表的中间结点
    private ListNode middleNode(ListNode head){
        ListNode slow=head;
        ListNode fast=head;
        while(fast!=null&&fast.next!=null){
            slow=slow.next;
            fast=fast.next.next;
        }
        return slow;
    }
    //206.反转链表
    public ListNode reverseList(ListNode head) {
        ListNode pre=null;
        ListNode cur=head;
        while(cur!=null){
            ListNode nxt=cur.next;
            cur.next=pre;
            pre=cur;
            cur=nxt;
        }
        return pre;
    }
}
相关推荐
凌波粒2 小时前
LeetCode--491.递增子序列(回溯算法)
数据结构·算法·leetcode
郝学胜-神的一滴2 小时前
CMake 019:程序生成与清理全解析
开发语言·c++·qt·程序人生·软件构建·cmake
疯狂成瘾者2 小时前
Java 集合 LinkedList 详解:链表结构、常用方法和队列使用
java·开发语言·链表
退休倒计时3 小时前
【每日一题】LeetCode 146. LRU 缓存 TypeScript
算法·leetcode·缓存·typescript
WL学习笔记3 小时前
单项不带头不循环链表
数据结构·链表
Oo_行者_oO3 小时前
删库先别跑路,万一修复呢?MySQL 误删数据恢复可落地运维文档
数据库·面试
小糯米6013 小时前
JS 数组
数据结构·算法·排序算法
Moment3 小时前
从多人编辑到 Agent 写文档,Hocuspocus v4 正在改写协同系统 😍😍😍
前端·后端·面试
小欣加油3 小时前
leetcode3612 用特殊操作处理字符串I
数据结构·c++·算法·leetcode·职场和发展
贺国亚4 小时前
评估-Eval-Hallucination与质量度量
后端·面试