234. Palindrome Linked List

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?

Solution:Two pointers

思路: Find mid + reverse + compare
Time Complexity: O(N) Space Complexity: O(N)

Solution Code:

class Solution {
    public boolean isPalindrome(ListNode head) {
        
        // find middle = slow
        // 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> null
        //               slow                 fast
        // 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> null
        //               slow      fast
        ListNode fast = head, slow = head;
        while(fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;
        }
        if (fast != null) { // odd nodes
            slow = slow.next;
        }
        
        // reverse
        slow = reverse(slow);
        
        // compare 
        fast = head;
        while (slow != null) {
            if (fast.val != slow.val) {
                return false;
            }
            fast = fast.next;
            slow = slow.next;
        }
        return true;
        
    }
    private  ListNode reverse(ListNode head) {
        ListNode prev = null;
        while (head != null) {
            ListNode next = head.next;
            head.next = prev;
            prev = head;
            head = next;
        }
        return prev;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容