Created
April 1, 2026 14:36
-
-
Save spirinvladimir/e1e99da6f6b30f98b82d5aa41ebbb5fc to your computer and use it in GitHub Desktop.
LCA searching both paths at same time
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| lowest_common_ancestor = function(root, p, q) { | |
| var result = -1 | |
| var found_p = false | |
| var found_q = false | |
| var find_last_common = (dll_p, dll_q) => { | |
| var head_p = dll_p | |
| while (head_p.back) head_p = head_p.back | |
| var head_q = dll_q | |
| while (head_q.back) head_q = head_q.back | |
| while (head_p.val == head_q.val) { | |
| if (!head_p.next) break | |
| if (!head_p.next.val) break | |
| if (!head_q.next) break | |
| if (!head_q.next.val) break | |
| head_p = head_p.next | |
| head_q = head_q.next | |
| } | |
| result = head_p.val.val | |
| } | |
| var find_node = (node, dll_p, dll_q) => { | |
| if (found_p && found_q) { | |
| //ok! now check LCA as a last same element between two linked lists | |
| find_last_common(dll_p, dll_q) | |
| } else if (found_p) { //keep looking q | |
| if (node.val == q) { | |
| found_q = true | |
| find_last_common(dll_p, dll_q) | |
| } else { | |
| dll_q.val = node | |
| dll_q.next = {back: dll_q} | |
| if (node.left) { | |
| find_node(node.left, {...dll_p}, {...dll_q.next}) | |
| } | |
| if (node.right) { | |
| find_node(node.right, {...dll_p}, {...dll_q.next}) | |
| } | |
| } | |
| } else if (found_q) {// keep looking p | |
| if (node.val == p) { | |
| found_p = true | |
| find_last_common(dll_p, dll_q) | |
| } else { | |
| dll_p.val = node | |
| dll_p.next = {back: dll_p} | |
| if (node.left) { | |
| find_node(node.left, {...dll_p.next}, {...dll_q}) | |
| } | |
| if (node.right) { | |
| find_node(node.right, {...dll_p.next}, {...dll_q}) | |
| } | |
| } | |
| } else { | |
| if (node.val == p) { | |
| found_p = true | |
| } else { | |
| dll_p.val = node | |
| dll_p.next = {back: dll_p} | |
| dll_p = dll_p.next | |
| if (node.val == q) { | |
| found_q = true | |
| } else { | |
| dll_q.val = node | |
| dll_q.next = {back: dll_q} | |
| dll_q = dll_q.next | |
| } | |
| } | |
| if (node.left) { | |
| find_node(node.left, {...dll_p}, {...dll_q}) | |
| } | |
| if (node.right) { | |
| find_node(node.right, {...dll_p}, {...dll_q}) | |
| } | |
| } | |
| } | |
| var dll_p = {val: null, next: null, back: null} | |
| var dll_q = {val: null, next: null, back: null} | |
| find_node(root, dll_p, dll_q) | |
| return result | |
| } | |
| root = { | |
| val: 6, | |
| left: { | |
| val: 2, | |
| left: { | |
| val: 0, | |
| left: null, | |
| right: null | |
| }, | |
| right: { | |
| val: 4, | |
| left: { | |
| val: 3 | |
| }, | |
| right: { | |
| val: 5 | |
| } | |
| } | |
| }, | |
| right: { | |
| val: 8, | |
| left: { | |
| val: 7 | |
| }, | |
| right: { | |
| val: 9 | |
| } | |
| } | |
| } | |
| lowest_common_ancestor(root, 2, 8) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment