• 5.15


    Solution1: Reverse and Compare

    翻转整个Linked List, 然后用两个指针进行逐一比对

    Solution2: Iterative Approach -> use Stack

    boolean isPalindrome(ListNode head) {
        ListNode fast = head;
        ListNode slow = head;
        
        Stack<Integer> stack = new Stack<Integer>();
    
        while (fast != null && fast.next != null) {
            stack.push(slow.data);
            slow = slow.next;
            fast = fast.next.next;
        }
    
    // Has odd number of elements, so skip the middle element 
        if (fast != null) {
            slow = slow.next;
        }
    
        while (slow != null) {
            int top = stack.pop().intValue();
    
            /* If values are different, then it's not a palindrome */
            if (top != slow.data) {
                return false;
            }
            slow = slow.next;
        }
        return true;
    }
    
    
    Recursive Approach
    Q: How recursive function would work?
    A: 
    
    Q: How can we get to the end of the list? How can we compare node i with node n - i?
    
    从head 开始遍历,但是从中间开始做compare
    
    ```java
    class Result {
        public ListNode node;
        public boolean result;
    }
    
    /* Result当中 {
        node 存储的是当前遍历的指针位置    
        result表示当前比较的结果 
    }
    
    */
    boolean isPalindrome(ListNode head) {
        int length = getLength(head);
        Result p = isPalindromeRecurse(head, length);
        return p.result;
    }
    
    Result isPalindromeRecurse(ListNode head, int length) {
        
        // 递归的出口 
        if (head == null || length <= 0) { 
            //if the input is null  or the head points to the middle of the list
            return new Result(head, true);
        } else if (length == 1) { 
            // if the middle + 1 of the list  
            return new Result(head.next, true);
        }
        
        // 递归的调用
        Result res = isPalindromeRecurse(head.next, length - 2);
        if (!res.result || res.node == null) {
            return res;
        }
    
        // result
        res.result = (head.data == res.node.data);
        /* Return corresponding node. */
        //在递归出口之前 将指针右移
        res.node = res.node.next;
        
        return res;
    }
    

    160. Intersection of Two Linked Lists (cc189 2.7)

    Q: insersection 节点之后的ListNode 全部重合,
    至少要遍历一遍linkedlist
    只给了两个头结点,主要问题在于当两个list的长度不一致的时候,如何进行intersection的确定? 链表的遍历是否要同步? 这样会出现headA超前headB的情况

  • 相关阅读:
    iOS微信打开App
    HTTP请求中的Form Data与Request Payload的区别
    iPhone设备分辨率一览
    iOS JS与原生交互(全集)
    iOS与导航相关的都在这
    iOS论App推送方案
    iOS接收远程通知响应方法
    iOS10以前的本地通知和远程通知
    手写一个MVVM
    react组件中返回并列元素的方法
  • 原文地址:https://www.cnblogs.com/kong-xy/p/9049041.html
Copyright © 2020-2023  润新知