1305. 两棵二叉搜索树中的所有元素【中等题】【每日一题】
思路:
将两个树分别前序遍历存入
ans
列表,最后对ans
排序即可。
代码:
/**
* 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> getAllElements(TreeNode root1, TreeNode root2) {
List<Integer> ans = new ArrayList<>();
dfs(root1,ans);
dfs(root2,ans);
Collections.sort(ans);
return ans;
}
public void dfs(TreeNode root,List<Integer> ans){
if(root == null){
return;
}
ans.add(root.val);
dfs(root.left,ans);
dfs(root.right,ans);
}
}
剑指 Offer II 023. 两个链表的第一个重合节点【简单题】
思路1:【哈希表】
遍历链表
A
,并将每个节点添加到哈希表set
中,在遍历链表B
,当遍历到的节点已经在set
中出现过时,说明这个节点是两个链表的公共节点,其两个链表相交的起始节点。如果链表B
遍历完全都不曾在set
中出现,说明两个链表无交点,返回null
。
代码:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
Set<ListNode> set = new HashSet<>();
while(headA != null){
set.add(headA);
headA = headA.next;
}
while(headB != null){
if(set.contains(headB)){
return headB;
}
headB = headB.next;
}
return null;
}
}
思路2:【双指针】
定义节点指针
pA
和pB
,初始分别指向链表A
和链表B
的头节点,然后同时遍历两个链表,每次遍历移动p
指针,pA
指向A
的下一个节点,当A
的下一个节点为null
即已到A
链表末尾时,pA
指向B
链表的头节点,pB
指向B
的下一个节点,当B
的下一个节点为null
即已到B
链表末尾时,pB
指向A
链表的头节点。两条链表分别以对方构造闭环,两个环的第一个相交的点即为两条链表相交的起始交点。
另外需要注意,如果两个链表中任意一个为空,则必不可能相交,直接返回
null
;如果两个链表都不为空,那么此时又分两种情况,一种是两个环相交,此时两个链表必有交点,且可以求出;另一种是两个环不相交,此时如果两个链表长度相等,则pA
指针和pB
指针会同时到达尾结点,即同时为null
,此时循环退出,返回null
。如果两个链表长度不等,则在pA
指针和pB
指针沿着环循环若干次之后必然会同时为null
,此时循环退出,返回null
。
代码:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if(headA == null || headB == null){
return null;
}
ListNode pA = headA,pB = headB;
while(pA != pB){
pA = pA == null ? headB : pA.next;
pB = pB == null ? headA : pB.next;
}
return pA;
}
}