📅  最后修改于: 2023-12-03 15:40:54.199000             🧑  作者: Mango
这是一个用于查找两个已排序链表的交集的 Javascript 程序。该程序使用双指针的方法,从头开始遍历两个链表,比较它们的值。当两个值相等时,将该值添加到结果链表中,并继续遍历两个链表。最终,结果链表将包含两个输入链表的交集。
以下是程序的完整代码片段:
function ListNode(val, next) {
this.val = (val === undefined ? 0 : val)
this.next = (next === undefined ? null : next)
}
function getIntersectionNode(headA, headB) {
let pA = headA, pB = headB
while (pA !== pB) {
pA = pA ? pA.next : headB
pB = pB ? pB.next : headA
}
return pA
}
程序中使用 ListNode 类来表示链表节点。每个节点包含一个值(整数)和一个指向下一个节点的指针。链表的末尾节点的指针为 null。
程序的核心是 getIntersectionNode() 函数。该函数接受两个链表的头节点作为输入,并返回它们的交点节点(如果有交点)。
该函数使用两个指针 pA 和 pB,分别指向输入链表的头节点。随着遍历两个链表,如果链表的长度不同,则其中一个指针将到达链表末尾,然后重新定位到另一个链表的头节点。如果两个指针相遇,则它们已经找到了交点,该节点将被返回。
以下是使用示例:
let headA = new ListNode(4)
headA.next = new ListNode(1)
headA.next.next = new ListNode(8)
headA.next.next.next = new ListNode(4)
headA.next.next.next.next = new ListNode(5)
let headB = new ListNode(5)
headB.next = new ListNode(0)
headB.next.next = new ListNode(1)
headB.next.next.next = headA.next.next
console.log(getIntersectionNode(headA, headB)) // 输出: ListNode { val: 8, next: ListNode { val: 4, next: ListNode { val: 5, next: null } } }
该示例创建两个链表,分别为 [4, 1, 8, 4, 5] 和 [5, 0, 1, 8, 4, 5]。两个链表的交点在节点 8 处。程序运行后,将打印该节点和其后面的节点作为输出。