The first solution of this problem can be based on the 236. Lowest Common Ancestor of a Binary Tree too:
public Node lowestCommonAncestor(Node p, Node q) { Node root = p; while(root.parent!=null) root = root.parent; return helper(root, p, q); } private Node helper(Node root, Node p, Node q){ if(root==null) return null; if(root==p || root==q) return root; Node left = helper(root.left, p, q); Node right = helper(root.right, p, q); if(left==null) return right; else if(right==null) return left; else return root; }
Because every node of the tree has a pointer to their parent, so this problem can be looked at a linked list too. x and y move forward to root, when meet root, x=q, y=p, at last, when x meet y, the node is their lowest common parent.
public Node lowestCommonAncestor(Node p, Node q) { Node x=p, y=q; while(x!=y){ if(x.parent!=null) x=x.parent; else x = q; if(y.parent!=null) y=y.parent; else y=p; } return x; }
The Recursive solution:
class Solution { Node originP, originQ; public Node lowestCommonAncestor(Node p, Node q) { originP=p; originQ = q; return helper(p, q); } private Node helper(Node p, Node q){ if(p==q) return p; if(p.parent==null) p=originQ; else p = p.parent; if(q.parent==null) q=originP; else q = q.parent; return helper(p,q); } }