剑指 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;
}
}
}