【作业6_2】链表专题:回文链表
对应课程链接:拿捏算法面试:反转链表
这是leetcode的一道题,其实本质上也是和反转链表一样,所以把它当作 作业吧,作业要求:
1、给出 234. 回文链表 运行通过的代码。
2、给出你的时间复杂度和空间复杂度。
3、进阶:给出空间复杂度为 O(1) 的解法。
答案:自己评论区看哈,其实就是和反转链表一样的。
PS:如果你不知道怎么打卡,可以看这里:打卡细则
对应课程链接:拿捏算法面试:反转链表
这是leetcode的一道题,其实本质上也是和反转链表一样,所以把它当作 作业吧,作业要求:
1、给出 234. 回文链表 运行通过的代码。
2、给出你的时间复杂度和空间复杂度。
3、进阶:给出空间复杂度为 O(1) 的解法。
答案:自己评论区看哈,其实就是和反转链表一样的。
PS:如果你不知道怎么打卡,可以看这里:打卡细则
共以下 21 个回答
“`
//快慢指针加递归
class Solution {
public boolean isPalindrome(ListNode head) {
if(head == null || head.next == null){
return true;
}
ListNode slow = head;
ListNode fast = head;
while(fast.next != null && fast.next.next != null){
slow = slow.next;
fast = fast.next.next;
}
ListNode halfEnd = reverseList(slow.next);
while(head != null && halfEnd != null){
if(head.val != halfEnd.val){
return false;
}
head = head.next;
halfEnd = halfEnd.next;
}
return true;
}
public ListNode reverseList(ListNode head) {
if(head == null || head.next == null){
return head;
}
}
“`java
递归方法
“`java
“`
递归
– Time:O(n)
– Space:O(n)
快慢指针+反转链表
打卡
O(n),O(n)
打卡
提交
时间复杂度:O(n),空间复杂度O(n)
时间o(n),空间o(1);
class Solution {
public boolean isPalindrome(ListNode head) {
//判断一下特殊情况吧,给一个数或者空链表时
if(head null||head.nextnull){
return true;
}
ListNode fast,slow;
slow = fast = head;
//循环使得fast在null停下(偶数会停在null处,但是奇数会停在上一步)
while(fast !=null&&fast.next !=null){
slow = slow.next;
fast = fast.next.next;
}
//如果奇数则调整一下slow使其指向右半第一个
if(fast!=null){
slow = slow.next;
}
//开始翻转slow后的链表用两个指针往中间靠近比对
ListNode left = head;
ListNode right = reverse(slow);
//比对细节即停止循环条件
while(right!=null){
if(left.val!=right.val){
return false;
}
left = left.next;
right = right.next;
}
return true;
}
ListNode reverse(ListNode head){
if(headnull||head.nextnull){
return head;
}
ListNode newNode = reverse(head.next);
head.next.next = head;
head.next = null;
return newNode;
}
}
找到中点slow(偶数个链表节点返回中间第一个节点)。
打卡
时间:O(n),空间O(1)
时间:$O(n)$
空间:$O(1)$
时间O(n)
空间O(1)
时间O(n),空间O(1)