本文已参与[新人创作]活动,一起开启掘金创作之路。 @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);
}
}
}