zoukankan      html  css  js  c++  java
  • 二叉树,二叉搜索树和链表的最近公共祖先

    二叉搜索树的最近公共祖先

    假如p, q在root同一侧,则继续递归这一侧,否则返回当前节点(可能当前节点为p,q之一,也可能在不同侧)
    如果是BST,可以保存到p, q的路径,然后找到链表最后一个公共节点即可
    235. Lowest Common Ancestor of a Binary Search Tree

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
    	TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
    		if(p->val < root->val && q->val < root->val) return lowestCommonAncestor(root->left, p, q);
            if(p->val > root->val && q->val > root->val) return lowestCommonAncestor(root->right, p, q);
    		return root;
    	}
    };
    

    二叉树的最近公共祖先

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
    	TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
    		if(!root || root == p || root == q) return root;
    		auto l = lowestCommonAncestor(root->left, p, q);
    		auto r = lowestCommonAncestor(root->right, p, q);
    		return !l ? r :!r ? l : root;
    	}
    }
    

    两个链表的第一个公共节点

    换着遍历,当遍历到长度为da(a独有) + db(b独有) + ab(ab公共部分)时,两指针会合,

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
            auto p = headA;
            auto q = headB;
            
            
            while(p != q){
                p = p ? p->next : headB;
                q = q ? q->next : headA;
            }
            
            return p;
        }
    };
    

    还有一种方法是计算链表长度的不谈了,我当时的做法时用异或+反转链表, 异或的结果就是第一个交点

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        ListNode* reverse(ListNode* h, intptr_t & pivot){
            auto cur = h;
            ListNode* prev = NULL;
            while(cur != NULL){
                pivot = pivot ^ (intptr_t)(cur);
                auto t = cur->next;
                cur->next = prev;
                prev = cur;
                cur = t;
            }
            
            return prev;
        }
        ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
    
            intptr_t pivot = 0;
            auto end = reverse(headA, pivot);
            auto b   = reverse(headB, pivot);
            auto a   = reverse(end, pivot);
            if(b == headA){
                return (ListNode*)pivot;
            } else {
                reverse(b, pivot);
                return NULL;
            }
        }
    };
    
    
  • 相关阅读:
    Python面向对象编程
    Python模块
    Python函数式编程(把函数作为参数传入)
    Python函数高级特性
    Python函数基础
    连续数字或英文字符文本强制换行
    flex布局文本过长不显示省略号
    在div中放一个相同大小的svg,实际显示的位置svg偏下
    设置git push默认branch
    c# using
  • 原文地址:https://www.cnblogs.com/qbits/p/11165298.html
Copyright © 2011-2022 走看看