数据结构与算法

剑指 Offer II 027 回文链表

2021-12-20  本文已影响0人  itbird01

剑指 Offer II 027. 回文链表

题意:给定一个链表的 头节点 head ,请判断其是否为回文链表。
如果一个链表是回文,那么链表节点序列从前往后看和从后往前看是相同的。

解题思路

解法:
1.解法很简单,就是遍历链表,将其转换为其他数据结构(例如:List、数组等),然后按照length递归对比--没有想到超时了~~~,认真审题发现,这个链表可能很大,如果遍历遍历+遍历数据结构+对比,耗时会很大
2.这时去想,如何减少一次遍历,最简单的想法就是,用空间换时间,目前第一种算法超时了,那是否有一种数据结构,可以不用遍历第二次,这时想到了string,其实可以把最终链表的值看做是个string,如果string从中间到两边是值是相等的,那我们可认为是一个回文链表
3.解法中采用了StringBuilder,进行字符的叠加,然后reverse之后的字符串与reverse之前的字符串,如果是回文链表,则substring(0, builder.length() / 2)肯定是相等的

解题遇到的问题

后续需要总结学习的知识点

##解法1--超时
class Solution {
    public boolean isPalindrome(ListNode head) {
        LinkedList<Integer> vaIntegers = new LinkedList<Integer>();
        while (head != null) {
            vaIntegers.add(head.val);
            head = head.next;
        }
        for (int i = 0, j = vaIntegers.size() - 1; i <= j; i++, j--) {
            if (vaIntegers.get(i) != vaIntegers.get(j)) {
                return false;
            }
        }
        return true;
    }

    
}

##解法2
class Solution {
    public static boolean isPalindrome(ListNode head) {
        StringBuilder builder = new StringBuilder();
        while (head != null) {
            builder.append(head.val);
            head = head.next;
        }
        String string = builder.substring(0, builder.length() / 2);
        String string1 = builder.reverse().substring(0, builder.length() / 2);
        return string.equals(string1);
    }

    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;
        }
    }
}
上一篇 下一篇

猜你喜欢

热点阅读