⭐️LeetCode每日一题⭐️
- 🍭 博客主页:南七的博客主页
- 🏀期待得到大家的点赞👍收藏💌留言🙋和关注💗
- 💬 持续刷题,每日一题 02
- 🙅博主水平有限,如果发现有不对的地方,希望大佬们指正!
- 😄放弃很容易,但坚持一定很酷,人生一次,怎愿甘拜下风!
- 💻来源:LeetCode 剑指 Offer II 027. 回文链表
- 系列文章持续更新中…
🌼 1.挡住众人的两数之和…
题目描述
给定一个链表的 头节点 head ,请判断其是否为回文链表。
如果一个链表是回文,那么链表节点序列从前往后看和从后往前看是相同的。
示例 1:
输入: head = [1,2,3,3,2,1]
输出: true
示例 2:
输入: head = [1,2]
输出: false
提示:
链表 L 的长度范围为 [1, 105]
0 <= node.val <= 9
😄博主的脑回路:
刚拿到题目,啊,回文?啊,链表?满脑子就在那里想如何把链表拆分两半比较,不过怎么想也觉得不对。此时脑海中冒出一个想法,因为以前做过一个用数组的方式实现的判断回文数的题目,链表不好操作,那我把他转换成数组不就行了嘛,然后把链表的值存放在数组中,只要对数组从两头遍历就可以了。啊啊啊啊,真是太激动了!竟然第一次独立的想出解法。果然,刷题还是有很大帮助的。
闲话少说,步入正题,让我们对该题进行仔细的分析
🌔判断数组是否回文相对于判断链表是否回文是相对简单的。该链表是一个单向链表,只能从头结点依次向后访问,如果我们想要比较第一个结点和最后一个结点是很困难的。但是,我们可以很方便的访问到数组中任一索引的值,并且访问每一个元素的时间复杂度都是O(1)的。那么,将链表转化为数组来判断是否回文就简便了很多。对于数组,我们只需要从两端向中间遍历即可,一次比较两端的数据的值是否相等,如果存在不相等的情况就输出为false,否则就为true。
📑题解:
/**
* 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) {
//将链表中的内容读取到数组当中
List<Integer> list = new ArrayList<Integer>();
ListNode temp = head;
while(true){
if(temp == null){
break;
}
list.add(temp.val);
temp = temp.next;
}
//从两头遍历
for(int i=0;i<=list.size()/2;i++){
if(!(list.get(i).equals(list.get(list.size()-1-i)))){
return false;
}
}
return true;
}
}
📑官方解答:
class Solution {
public boolean isPalindrome(ListNode head) {
List<Integer> vals = new ArrayList<Integer>();
// 将链表的值复制到数组中
ListNode currentNode = head;
while (currentNode != null) {
vals.add(currentNode.val);
currentNode = currentNode.next;
}
// 使用双指针判断是否回文
int front = 0;
int back = vals.size() - 1;
while (front < back) {
if (!vals.get(front).equals(vals.get(back))) {
return false;
}
front++;
back--;
}
return true;
}
}
🏀期待得到大家的点赞👍收藏💌留言🙋和关注💗