刷题
问题描述:
给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。
示例 1:
输入:head = [1,2,2,1]
输出:true
示例 2:
输入:head = [1,2]
输出:false
提示:
链表中节点数目在范围[1, 105] 内
0 <= Node.val <= 9
进阶:你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
解法一:
暴力解法
遍历节点然后拼接到字符串上
使用StringBuffer反转字符串
比较这两字符串比较是否一样
public boolean isPalindrome(ListNode head) {
if(head==null) return false;
String str="";
while(head!=null) {
str+=head.val;
head= head.next;
}
StringBuffer sb=new StringBuffer(str);
String strServer= sb.reverse().toString();
return str.equals(strServer);
}
运行效果:(蚌埠住了) 卡在最后的案例
解法二:
双指针
- 将链表的元素放到集合中
- 集合中进行判断回文
public static boolean isPalindrome(ListNode head) {
//将链表的元素放到集合中
List<Integer> list=new ArrayList<Integer>();
while(head!=null) {
list.add(head.val);
head=head.next;
}
//集合中进行判断回文
int left=0;
int right=list.size()-1;
while(left<right) {
//两边比较 如果相同继续 1 2 3 1 1跟1相同继续 2跟3不同返回false
if(!list.get(left).equals(list.get(right))){
return false;
}
left++;
right--;
}
return true;
}
运行效果