|
749 | 749 | 17. 合并两个排序的链表 |
750 | 750 | 输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按 |
751 | 751 | 照递增排序的。 |
| 752 | + 思路: 合并两个链表,按照递增顺序,那就是假设第一个链表是1 3 第二个链表是2 4 6那怎么去合并呢? |
| 753 | + 先是比较两个链表的头结点,1和2比较,那合并后的新链表头肯定是1了,然后再拿2和3比较看谁是第二个结点,那可定是2了,到这里就确定了新链表的前两个结点, |
| 754 | + 就是1 2 然后再用3和4比较确定谁是第三个,这是啥?这是递归。 |
| 755 | + ```java |
| 756 | + public class MergeListTest { |
| 757 | + public static void main(String[] args) { |
| 758 | + ListNode head1 = new ListNode(); |
| 759 | + ListNode second1 = new ListNode(); |
| 760 | + ListNode head2 = new ListNode(); |
| 761 | + ListNode second2 = new ListNode(); |
| 762 | + ListNode third2 = new ListNode(); |
| 763 | + head1.nextNode = second1; |
| 764 | + head2.nextNode = second2; |
| 765 | + second2.nextNode = third2; |
| 766 | + head1.data = 1; |
| 767 | + second1.data = 3; |
| 768 | + head2.data = 2; |
| 769 | + second2.data = 2; |
| 770 | + third2.data = 2; |
| 771 | + MergeListTest test = new MergeListTest(); |
| 772 | + ListNode result = test.mergeList(head1, head2); |
| 773 | + System.out.println(result.nextNode.nextNode.nextNode.nextNode.data); |
| 774 | + } |
| 775 | + |
| 776 | + public ListNode mergeList(ListNode head1, ListNode head2) { |
| 777 | + if (head1 == null) { |
| 778 | + return head2; |
| 779 | + } else if (head2 == null) { |
| 780 | + return head1; |
| 781 | + } |
| 782 | + ListNode mergeHead = null; |
| 783 | + if (head1.data < head2.data) { |
| 784 | + mergeHead = head1; |
| 785 | + mergeHead.nextNode = mergeList(head1.nextNode, head2); |
| 786 | + } else { |
| 787 | + mergeHead = head2; |
| 788 | + mergeHead.nextNode = mergeList(head1, head2.nextNode); |
| 789 | + } |
| 790 | + return mergeHead; |
| 791 | + } |
| 792 | + } |
| 793 | + |
| 794 | + class ListNode { |
| 795 | + public ListNode nextNode; |
| 796 | + public int data; |
| 797 | + |
| 798 | + public ListNode getNextNode() { |
| 799 | + return nextNode; |
| 800 | + } |
| 801 | + |
| 802 | + public void setNextNode(ListNode nextNode) { |
| 803 | + this.nextNode = nextNode; |
| 804 | + } |
| 805 | + |
| 806 | + public int getData() { |
| 807 | + return data; |
| 808 | + } |
| 809 | + |
| 810 | + public void setData(int data) { |
| 811 | + this.data = data; |
| 812 | + } |
| 813 | + } |
| 814 | + ``` |
| 815 | +18. 树的子结构 |
| 816 | + |
| 817 | + 输入两颗二叉树 A 和 B,判断 B 是不是 A 的子结构。 |
| 818 | +  |
| 819 | + 思路: 想要判断B树是不是A的子树,那首先要先去在A树种遍历找到与B树根节点相同的结点,然后再从这个结点去遍历子结点 |
| 820 | + 看字节点与B树是否一样,如果不一样就继续往下遍历结点,找与B树根节点一直的结点,如此循环。 |
| 821 | + 以上图为例,我们先在A中找8的结点,发现A的根节点就是,然后继续看A的左子节点是8,而B的左子节点是9,锁着这 |
| 822 | + 肯定不是了,继续往下找为8的结点,发现在A树的第二层找打了,然后再进行判断该结点下的子节点,发现为9和2,正好与B的相同 |
| 823 | + 就是他了。 |
| 824 | + ```java |
| 825 | + public class Problem18 { |
| 826 | + public static void main(String args[]) { |
| 827 | + BinaryTreeNode root1 = new BinaryTreeNode(); |
| 828 | + BinaryTreeNode node1 = new BinaryTreeNode(); |
| 829 | + BinaryTreeNode node2 = new BinaryTreeNode(); |
| 830 | + BinaryTreeNode node3 = new BinaryTreeNode(); |
| 831 | + BinaryTreeNode node4 = new BinaryTreeNode(); |
| 832 | + BinaryTreeNode node5 = new BinaryTreeNode(); |
| 833 | + BinaryTreeNode node6 = new BinaryTreeNode(); |
| 834 | + root1.leftNode = node1; |
| 835 | + root1.rightNode = node2; |
| 836 | + node1.leftNode = node3; |
| 837 | + node1.rightNode = node4; |
| 838 | + node4.leftNode = node5; |
| 839 | + node4.rightNode = node6; |
| 840 | + root1.value = 8; |
| 841 | + node1.value = 8; |
| 842 | + node2.value = 7; |
| 843 | + node3.value = 9; |
| 844 | + node4.value = 2; |
| 845 | + node5.value = 4; |
| 846 | + node6.value = 7; |
| 847 | + BinaryTreeNode root2 = new BinaryTreeNode(); |
| 848 | + BinaryTreeNode a = new BinaryTreeNode(); |
| 849 | + BinaryTreeNode b = new BinaryTreeNode(); |
| 850 | + root2.leftNode = a; |
| 851 | + root2.rightNode = b; |
| 852 | + root2.value = 8; |
| 853 | + a.value = 9; |
| 854 | + b.value = 2; |
| 855 | + System.out.println(hasSubTree(root1, root2)); |
| 856 | + } |
| 857 | + |
| 858 | + public static boolean hasSubTree(BinaryTreeNode root1, BinaryTreeNode root2) { |
| 859 | + boolean result = false; |
| 860 | + if (root1 != null && root2 != null) { |
| 861 | + if (root1.value == root2.value) { |
| 862 | + result = doesTree1HavaTree2(root1, root2); |
| 863 | + if (!result) { |
| 864 | + result = hasSubTree(root1.leftNode, root2); |
| 865 | + } |
| 866 | + if (!result) { |
| 867 | + result = hasSubTree(root1.rightNode, root2); |
| 868 | + } |
| 869 | + } |
| 870 | + } |
| 871 | + return result; |
| 872 | + } |
| 873 | + |
| 874 | + private static boolean doesTree1HavaTree2(BinaryTreeNode root1, |
| 875 | + BinaryTreeNode root2) { |
| 876 | + if (root2 == null) { |
| 877 | + return true; |
| 878 | + } else if (root1 == null) |
| 879 | + return false; |
| 880 | + if (root1.value != root2.value) { |
| 881 | + return false; |
| 882 | + } |
| 883 | + return doesTree1HavaTree2(root1.leftNode, root2.leftNode) |
| 884 | + && doesTree1HavaTree2(root1.rightNode, root2.rightNode); |
| 885 | + } |
| 886 | + } |
752 | 887 |
|
| 888 | + class BinaryTreeNode { |
| 889 | + int value; |
| 890 | + BinaryTreeNode leftNode; |
| 891 | + BinaryTreeNode rightNode; |
| 892 | + } |
| 893 | + ``` |
| 894 | + |
| 895 | +19. 二叉树的镜像 |
| 896 | + 请完成一个函数,输入一个二叉树,该函数输出它的镜像。 |
| 897 | + |
753 | 898 | --- |
754 | 899 |
|
755 | 900 | - 邮箱 :charon.chui@gmail.com |
|
0 commit comments