Skip to content

Instantly share code, notes, and snippets.

@spirinvladimir
Created April 1, 2026 14:36
Show Gist options
  • Select an option

  • Save spirinvladimir/e1e99da6f6b30f98b82d5aa41ebbb5fc to your computer and use it in GitHub Desktop.

Select an option

Save spirinvladimir/e1e99da6f6b30f98b82d5aa41ebbb5fc to your computer and use it in GitHub Desktop.
LCA searching both paths at same time
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