解法1:使用栈
出栈后和原来的节点对比,注意比较的是val,而不是节点本身:if(reverse.val != original.val)
时间复杂度:O(n)
空间复杂度:O(n)
import java.util.*;
public class Solution {
public boolean isPail (ListNode head) {
if (head == null) {
return false;
}
Stack<ListNode> reversedList = new Stack<ListNode>();
ListNode current = head;
while(current != null){
reversedList.push(current);
current = current.next;
}
ListNode reverse = reversedList.pop();
ListNode original = head;
while(!reversedList.empty() && original != null){
if(reverse.val != original.val){
return false;
}
reverse = reversedList.pop();
original = original.next;
}
return true;
}
}
解法2:反转后半部分,双指针辅助寻找中点
时间复杂度:O(n)
空间复杂度:O(1)
import java.util.*;
public class Solution {
public boolean isPail (ListNode head) {
if (head == null) {
return false;
}
ListNode reversedFromMiddle = reverse(getMiddleOfList(head));
ListNode original = head;
while (reversedFromMiddle != null) {
if (reversedFromMiddle.val != original.val) {
return false;
}
reversedFromMiddle = reversedFromMiddle.next;
original = original.next;
}
return true;
}
private ListNode getMiddleOfList(ListNode head) {
ListNode left = head;
ListNode right = head;
while (right != null && right.next != null) {
left = left.next;
right = right.next.next;
}
if (right == null) {
return left;
} else {
return left.next;
}
}
private ListNode reverse(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode headOfReversed = reverse(head.next);
head.next.next = head;
head.next = null;
return headOfReversed;
}
}

京公网安备 11010502036488号