LeetCode 题解(186): Palindrome Linked List

来源:互联网 发布:西城区2016年经济数据 编辑:程序博客网 时间:2024/06/03 01:20

题目:

Given a singly linked list, determine if it is a palindrome.

Follow up:
Could you do it in O(n) time and O(1) space?

题解:

O(1)space需要in-place的reverse后半拉list,然后比较,用两个指针找到后半拉的起始位置。

C++版:

class Solution {public:    bool isPalindrome(ListNode* head) {        if(head == NULL || head->next == NULL)            return true;        ListNode* s = head, *f = head;        while(f->next != NULL && f->next->next != NULL) {            f = f->next->next;            s = s->next;        }        s->next = reverse(s->next);        s = s->next;        ListNode* p = head;        while(s != NULL) {            if(s->val != p->val)                return false;            s = s->next;            p = p->next;        }        return true;    }        ListNode* reverse(ListNode* root) {        if(root->next == NULL)            return root;        ListNode* newRoot = reverse(root->next);        root->next->next = root;        root->next = NULL;        return newRoot;    }};

Java版:

public class Solution {    public boolean isPalindrome(ListNode head) {        if(head == null || head.next == null)            return true;        ListNode s = head, f = head;        while(f.next != null && f.next.next != null) {            s = s.next;            f = f.next.next;        }        s.next = reverse(s.next);        s = s.next;        ListNode p = head;        while(s != null) {            if(s.val != p.val)                return false;            s = s.next;            p = p.next;        }        return true;    }        public ListNode reverse(ListNode root) {        if(root.next == null)            return root;        ListNode newRoot = reverse(root.next);        root.next.next = root;        root.next = null;        return newRoot;    }}

Python版:

class Solution:    # @param {ListNode} head    # @return {boolean}    def isPalindrome(self, head):        if head == None or head.next == None:            return True        fast, slow = head, head        while fast.next != None and fast.next.next != None:            fast = fast.next.next            slow = slow.next        slow.next = self.reverse(slow.next)        slow = slow.next        p = head        while slow != None:            if slow.val != p.val:                return False            slow = slow.next            p = p.next        return True            def reverse(self, head):        if head.next == None:            return head        newHead = self.reverse(head.next)        head.next.next = head        head.next = None        return newHead

0 0