五道题

75 阅读3分钟

本文已参与[新人创作]活动,一起开启掘金创作之路。 @TOC

083删除排序链表中的重复元素

代码

class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        // 犯错地方:头结点指向第一个结点
        // 如果为空链表或只有一个结点
        if(head==null||head.next==null){
            return head;
        }
        else{
            // 依次比较邻近元素是否相等
            // 第一个元素
            ListNode node1=head;
            // 结束条件:
            while(node1.next!=null){
                // 如果邻近结点不相等则比较邻近的下两个
                if(node1.val!=node1.next.val){
                    node1=node1.next;
                }
                else{
                    // 相等的话则要删除结点
                    node1.next=node1.next.next;
                }
            }
            return head;
        }
    }
}

088合并两个有序数组

代码

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        // 注意:从后往前存储
        // 通过变量来存储
        // 两个变量i,j来遍历两个数组
        // 两两比较,用遍历m来存入数组
        int k=m+n-1;
        // 遍历数组
        int i,j;
        for( i=m-1,j=n-1;i>=0&&j>=0;){
            // 如果nums1当前遍历的元素不小于nums2的
            if(nums1[i]>=nums2[j]){
                // 存入nums[i],下标k,i--,下标j不变
                nums1[k--]=nums1[i--];
            }
            else{
                // 存入nums2[j],下标k,j--,下标i不必
                nums1[k--]=nums2[j--];
            }
        }
        // 如果num1未遍历完
        while(i>=0){
            nums1[k--]=nums1[i--];
        }
        // 如果num2未遍历完
        while(j>=0){
            nums1[k--]=nums2[j--];
        }
    }
}

094二叉树的中序遍历

代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        // 中序遍历:左根右
        // 创建链表,注意List是个接口
        List<Integer> list=new ArrayList<Integer>();
         List<Integer> list1=new ArrayList<Integer>();
        // 判断根是否未空
        if(root==null){
            // 为空返回空链表
            return list;
        }
        // 判断左子树是否为空
        if(root.left!=null){
            // 不为空,则遍历左子树
            // 存入左子树的元素
            /*
            addAll()用于添加链表的所有元素,
            不会去重
            */
         list.addAll(inorderTraversal(root.left));
        }
        // 添加根节点的val
        list.add(root.val);
        // 判断右子树是否为空
        if(root.right!=null){
             // 不为空,则遍历右子树
            // 存入右子树的元素
            /*
            addAll()用于添加链表的所有元素,
            不会去重
            */
            list.addAll(inorderTraversal(root.right));
        }
        return list;
    }
}

100相同的树

代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public boolean isSameTree(TreeNode p, TreeNode q) {
        // 首先看有没有为空树
        if(p==null&&q!=null){
            return false;
        }
        else if(p!=null&&q==null){
            return false;
        }
        else if(p==null&&q==null){
            return true;
        }
        // 两个均不为孔数
        else{
            // 根据前序
            // 先看跟
            if(p.val!=q.val){
                // 不相等
                return false;
            }
            // 相等
            else{
                // 遍历左子树
                boolean flag=isSameTree(p.left,q.left);
                // 如果相等
                if(flag){
                    // 遍历右子树
                    return  isSameTree(p.right,q.right);
                }
                // 不相等
                else{
                    return false;
                }
            }
        }
    }
}

101对称二叉树

代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public boolean isSame(TreeNode root1,TreeNode root2){
        // 如果都为空
        if(root1==null&&root2==null){
            return true;
        }
        // 仅一个为空
        else if(root1==null||root2==null){
            return false;
        }
        // 均不为空
        // 根
        else{
            // 根不相等
            if(root1.val!=root2.val){
                return false;
            }
            // 根相等
            else{
                // 判断左结点的左子树与右节点的右子树是否相等
                boolean flag=isSame(root1.left,root2.right);
                // 相等
                if(flag){
                     // 判断左结点的右子树与右节点的左子树是否相等
                    return isSame(root1.right,root2.left);
                }
                // 不相等
                else{
                    return false;
                }
            }
        }
    }
    public boolean isSymmetric(TreeNode root) {
        // 如果为空树
        if(root==null){
            return true;
        }
        // 如果仅一个结点
        else if(root.left==null&&root.right==null){
            return true;
        }
        // 如果仅左或右为空
        else if(root.left==null||root.right==null){
            return false;
        }
        // 均不为空
        else{
            // 判断左右子树是否对称
            return isSame(root.left,root.right);
        }
    }
}