diff --git a/.idea/workspace.xml b/.idea/workspace.xml index fe17389..6c901b9 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,7 +2,14 @@ - + + + + + + + + + + + - @@ -73,13 +85,13 @@ - - - @@ -292,73 +311,78 @@ - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - + + - + diff --git a/src/q101/f1/Solution.java b/src/q101/f1/Solution.java new file mode 100644 index 0000000..715f574 --- /dev/null +++ b/src/q101/f1/Solution.java @@ -0,0 +1,66 @@ +package q101.f1; + +import java.util.ArrayList; +import java.util.List; + +/** + * 层序遍历放入list对比 o(n*log(n)) + */ +public class Solution { + public boolean isSymmetric(List nodes) { + if (nodes.size() < 2) { + return true; + } + int i = 0; + int j = nodes.size() - 1; + while (i < j) { + if (nodes.get(i) == nodes.get(j)) { + i++; + j--; + } else if (nodes.get(i) == null || nodes.get(j) == null || nodes.get(i).val != nodes.get(j).val) { + return false; + } else { + i++; + j--; + } + } + return true; + } + + public boolean isSymmetric(TreeNode root) { + List list = new ArrayList<>(); + list.add(root); + while (list.size() != 0) { + List temp = new ArrayList<>(); + for (int i = 0; i < list.size(); i++) { + if (list.get(i) != null) { + temp.add(list.get(i).left); + temp.add(list.get(i).right); + } + } + if (!isSymmetric(temp)) { + return false; + } + list = temp; + } + return true; + } + + public static void main(String[] args) { + TreeNode root = new TreeNode(1); + TreeNode t1 = new TreeNode(2); + TreeNode t2 = new TreeNode(2); + root.left = t1; + root.right = t2; + TreeNode t3 = new TreeNode(3); + TreeNode t4 = new TreeNode(4); + t1.left = t3; + t1.right = t4; + TreeNode t5 = new TreeNode(4); + TreeNode t6 = new TreeNode(3); + t2.left = t5; + t2.right = t6; + + System.out.println(new Solution().isSymmetric(root)); + } +} diff --git a/src/q101/f1/TreeNode.java b/src/q101/f1/TreeNode.java new file mode 100644 index 0000000..6d00655 --- /dev/null +++ b/src/q101/f1/TreeNode.java @@ -0,0 +1,11 @@ +package q101.f1; + +public class TreeNode { + int val; + TreeNode left; + TreeNode right; + + TreeNode(int x) { + val = x; + } +} diff --git a/src/q101/f2/Solution.java b/src/q101/f2/Solution.java new file mode 100644 index 0000000..6ddd58d --- /dev/null +++ b/src/q101/f2/Solution.java @@ -0,0 +1,51 @@ +package q101.f2; + +import java.util.LinkedList; +import java.util.Queue; + +/** + * 利用队列的层序遍历(广度优先搜索BFS)o(n) + */ +public class Solution { + public boolean isSymmetric(TreeNode root) { + Queue q = new LinkedList<>(); + q.add(root); + q.add(root); + while (!q.isEmpty()) { + TreeNode t1 = q.poll(); + TreeNode t2 = q.poll(); + if (t1 == null && t2 == null) { + continue; + } + if (t1 == null || t2 == null) { + return false; + } + if (t1.val != t2.val) { + return false; + } + q.add(t1.left); + q.add(t2.right); + q.add(t1.right); + q.add(t2.left); + } + return true; + } + + public static void main(String[] args) { + TreeNode root = new TreeNode(1); + TreeNode t1 = new TreeNode(2); + TreeNode t2 = new TreeNode(2); + root.left = t1; + root.right = t2; + TreeNode t3 = new TreeNode(3); + TreeNode t4 = new TreeNode(4); + t1.left = t3; + t1.right = t4; + TreeNode t5 = new TreeNode(4); + TreeNode t6 = new TreeNode(3); + t2.left = t5; + t2.right = t6; + + System.out.println(new Solution().isSymmetric(root)); + } +} diff --git a/src/q101/f2/TreeNode.java b/src/q101/f2/TreeNode.java new file mode 100644 index 0000000..9940b08 --- /dev/null +++ b/src/q101/f2/TreeNode.java @@ -0,0 +1,11 @@ +package q101.f2; + +public class TreeNode { + int val; + TreeNode left; + TreeNode right; + + TreeNode(int x) { + val = x; + } +} diff --git a/src/q101/f3/Solution.java b/src/q101/f3/Solution.java new file mode 100644 index 0000000..49df621 --- /dev/null +++ b/src/q101/f3/Solution.java @@ -0,0 +1,22 @@ +package q101.f3; + +/** + * 递归 o(n)(如果一个树的左子树与右子树镜像对称,那么这个树是对称的。根结点相同并且每个树的左子树和另一个树的右子树镜像对称的树是镜像对称的) + */ +public class Solution { + public boolean isSymmetric(TreeNode root) { + return isMirror(root, root); + } + + public boolean isMirror(TreeNode t1, TreeNode t2) { + if (t1 == null && t2 == null) { + return true; + } + if (t1 == null || t2 == null) { + return false; + } + return (t1.val == t2.val) + && isMirror(t1.right, t2.left) + && isMirror(t1.left, t2.right); + } +} diff --git a/src/q101/f3/TreeNode.java b/src/q101/f3/TreeNode.java new file mode 100644 index 0000000..aae13dd --- /dev/null +++ b/src/q101/f3/TreeNode.java @@ -0,0 +1,11 @@ +package q101.f3; + +public class TreeNode { + int val; + TreeNode left; + TreeNode right; + + TreeNode(int x) { + val = x; + } +} diff --git a/src/q23/ListNode.java b/src/q23/ListNode.java new file mode 100644 index 0000000..6dd05fd --- /dev/null +++ b/src/q23/ListNode.java @@ -0,0 +1,10 @@ +package q23; + +public class ListNode { + int val; + ListNode next; + + ListNode(int x) { + val = x; + } +} diff --git a/src/q23/Solution.java b/src/q23/Solution.java new file mode 100644 index 0000000..5a974be --- /dev/null +++ b/src/q23/Solution.java @@ -0,0 +1,49 @@ +package q23; + +/** + * 做k-1次mergeTwoLists o(N*k) 可用分治法优化至o(N*log(k))) N为所有list的总节点数 + */ +class Solution { + public ListNode mergeTwoLists(ListNode l1, ListNode l2) { + if (l1 == null) { + return l2; + } + if (l2 == null) { + return l1; + } + ListNode head = new ListNode(Integer.MIN_VALUE); + head.next = l1; + ListNode pre = head; + while (l2 != null) { + ListNode t1 = pre.next; + ListNode t2 = l2.next; + while (l2.val > t1.val) { + if (t1.next == null) { + t1.next = l2; + return head.next; + } else { + pre = pre.next; + t1 = t1.next; + } + } + pre.next = l2; + l2.next = t1; + l2 = t2; + } + return head.next; + } + + public ListNode mergeKLists(ListNode[] lists) { + if (lists.length == 0) { + return null; + } + if (lists.length == 1) { + return lists[0]; + } + ListNode result = lists[0]; + for (int i = 1; i < lists.length; i++) { + result = mergeTwoLists(result, lists[i]); + } + return result; + } +}