LeetCode Palindrome LinkList

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

该题是判断一个链表是不是回文链表。

思路一:将该链表反转,然后从头开始对比节点值,时间复杂度O(n),空间复杂度O(N)

思路二:利用runner pointer。很多的题目都可以利用这个方法来解决。Runner pointer和递归是解决链表问题最常用的两个方法。

定义两个指针,slow runner和fast runner,fast以2倍于slow的速度向链表尾部移动。如有奇数个节点:当fast到达链表尾部时,slow恰好到达链表中间。如有偶数个节点:fast第一次为null时,slow恰好完成了一半节点的访问。把slow访问过的节点元素值压入一个stack里。此后slow继续向链表尾部访问,同时stack里的元素开始出栈(奇数个元素的情况下要跳过中间元素),比较两个元素值,一旦出现不等,则不是回文,否则是。该解法的时间复杂度是O(N),因为需要一次迭代,同时需要O(N)的空间用作stack来存放链表元素。

下面是这两种方法的实现

思路一:

 

思路二:

    public boolean isPalindrome(ListNode head) {

        if(head==null)

            return true;

        if(head!=null && head.next==null)

            return true;

        ListNode slow=head;

        ListNode fast=head;

        boolean skip=false;

        Stack<Integer> stack=new Stack<Integer>();

        while(slow!=null)

        {

            if(fast==null)//偶数个

            {

                skip=true;

                if(slow.val!=stack.pop())

                    return false;

            }

            if(fast!=null && fast.next==null)//奇数个

            {

                if(!skip)

                    slow=slow.next;

                skip=true;

                if(slow.val!=stack.pop())

                    return false;

            }

            if(!skip)

                stack.push(slow.val);

            slow=slow.next;

            if(fast!=null && fast.next!=null)

            {

                fast=fast.next.next;

            }

        }

        return true;

    }

 

你可能感兴趣的:(LeetCode)