-
2.10
- 忘了开头的判断,秒了
-
1.24
- 这一次用的双指针法,大胆用吧,反转后类似与y 型链表,共享中间节点(如果是奇数)
class Solution {
public boolean isPalindrome(ListNode head) {
if(head.next==null) return true;
ListNode slow = head;
ListNode fast = head;
// int count=0;
while(fast!=null&&fast.next!=null){
slow = slow.next;
fast = fast.next.next;
}
ListNode node2 = reverse(slow);
ListNode node1 = head;
while(node2!=null){
if(node1.val!=node2.val) return false;
node1 = node1.next;
node2 = node2.next;
}
return true;
}-
1.19
- 秒了,第二遍做的时候反转那里用的上一节的递归,有点爽
- 第二遍还是把比较条件算错了
-
不用专门判断链表长度是否为奇偶,
while(r!=null&&r.next!=null){将隐式的判断 -
11.9
- 我这里用的是length/2,可以用
- 这里对比的ptr.val,而相交列表对比的是ListNode本身
class Solution {
public boolean isPalindrome(ListNode head) {
ListNode ptr = head;
int count=0;
while(ptr!=null){
ptr = ptr.next;
count++;
}
if(count==1) return true;
ListNode head1 = head;
ListNode head2 = head;
int lotation =0;
while(lotation!=count/2){
head2 = head2.next;
lotation++;
}
ListNode newHead = reverse(head2);
while(newHead!=null){
if(head1.val!=newHead.val) return false;
head1 = head1.next;
newHead = newHead.next;
}
return true;
}
public ListNode reverse(ListNode head){
if(head==null||head.next==null) return head;
ListNode newHead = reverse(head.next);
head.next.next = head;
head.next=null;
return newHead;
}
} int length = 0;
ListNode ptr = head;
while(ptr!=null){
ptr = ptr.next;
length++;
}
// if(length==1) return true;
ptr = head;
for(int i=0;i<length/2;i++){
ptr = ptr.next;
}
class Solution {
public boolean isPalindrome(ListNode head) {
ListNode r = head;
ListNode l = head;
while(r!=null&&r.next!=null){
r = r.next;
l = l.next;
r = r.next;
}
ListNode n = reverse(l);
ListNode m = head;
while(n!=null){
if(n.val!=m.val){
return false;
}
n = n.next;
m = m.next;
}
return true;
}
public ListNode reverse(ListNode head){
ListNode pre = null;
ListNode currt = head;
while(currt!=null){
ListNode next = currt.next;
currt.next = pre;
pre = currt;
currt = next;
}
return pre;
}
}