Skip to content

Commit 3d2c0c5

Browse files
committed
Update 剑指Offer.md
1 parent 9cf1037 commit 3d2c0c5

File tree

1 file changed

+145
-0
lines changed

1 file changed

+145
-0
lines changed

Java基础/剑指Offer.md

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -749,7 +749,152 @@
749749
17. 合并两个排序的链表
750750
输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按
751751
照递增排序的。
752+
思路: 合并两个链表,按照递增顺序,那就是假设第一个链表是1 3 第二个链表是2 4 6那怎么去合并呢?
753+
先是比较两个链表的头结点,1和2比较,那合并后的新链表头肯定是1了,然后再拿23比较看谁是第二个结点,那可定是2了,到这里就确定了新链表的前两个结点,
754+
就是1 2 然后再用34比较确定谁是第三个,这是啥?这是递归。
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+
输入两颗二叉树 AB,判断 B 是不是 A 的子结构。
818+
![image](https://raw.githubusercontent.com/CharonChui/Pictures/master/findchildbinarytree.png)
819+
思路: 想要判断B树是不是A的子树,那首先要先去在A树种遍历找到与B树根节点相同的结点,然后再从这个结点去遍历子结点
820+
看字节点与B树是否一样,如果不一样就继续往下遍历结点,找与B树根节点一直的结点,如此循环。
821+
以上图为例,我们先在A中找8的结点,发现A的根节点就是,然后继续看A的左子节点是8,而B的左子节点是9,锁着这
822+
肯定不是了,继续往下找为8的结点,发现在A树的第二层找打了,然后再进行判断该结点下的子节点,发现为92,正好与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+
}
752887

888+
class BinaryTreeNode {
889+
int value;
890+
BinaryTreeNode leftNode;
891+
BinaryTreeNode rightNode;
892+
}
893+
```
894+
895+
19. 二叉树的镜像
896+
请完成一个函数,输入一个二叉树,该函数输出它的镜像。
897+
753898
---
754899

755900
- 邮箱 :charon.chui@gmail.com

0 commit comments

Comments
 (0)