1305. 两棵二叉搜索树中的所有元素 / 剑指 Offer II 023. 两个链表的第一个重合节点

这篇博客介绍了如何处理二叉搜索树与链表的数据结构问题。首先,通过前序遍历将二叉搜索树的所有元素存入列表并排序,解决了一道中等难度的问题。接着,讲解了两种方法找到两个链表的交点,第一种利用哈希表记录链表A的节点,然后遍历链表B查找交点;第二种采用双指针同步遍历,直到找到相同节点。这两种方法都适用于简单级别的链表问题。
摘要由CSDN通过智能技术生成

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:【双指针】

定义节点指针pApB,初始分别指向链表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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值