【Java】【JS】LeetCode - 哈希表 - 快慢指针 - # 160 相交链表
// Java 快慢指针解法:找出相交节点
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if (headA == null || headB == null) {
return null;
}
ListNode slow = headA;
ListNode fast = headB;
// 确保fast先走到两链表长度差的位置
if (headA.length != headB.length) {
if (headA.length > headB.length) {
fast = headA;
slow = headB;
}
int n = Math.abs(headA.length - headB.length);
while (n > 0) {
fast = fast.next;
n--;
}
}
// 当fast和slow相遇时,就是两链表的首个相交节点
while (slow != fast) {
slow = slow.next;
fast = fast.next;
}
return slow;
}
}
// JavaScript 快慢指针解法:找出相交节点
var getIntersectionNode = function(headA, headB) {
if (headA == null || headB == null) {
return null;
}
let slow = headA;
let fast = headB;
// 确保fast先走到两链表长度差的位置
if (headA.length !== headB.length) {
if (headA.length > headB.length) {
[slow, fast] = [fast, slow];
}
let n = Math.abs(headA.length - headB.length);
while (n > 0) {
fast = fast.next;
n--;
}
}
// 当fast和slow相遇时,就是两链表的首个相交节点
while (slow !== fast) {
slow = slow.next;
fast = fast.next;
}
return slow;
};
这两段代码都使用了快慢指针的方法来找出两个单链表相交的起始节点。快指针比慢指针走得快,如果两个链表相交,他们一定会在相交点相遇。慢指针起初指向链表A,快指针起初指向链表B,然后他们同时每次向前走一步或两步,直到快慢指针相遇,此时返回的快指针的位置就是两个链表相交的点。如果链表不相交,快指针会先到达链表的末尾,此时应返回null。
评论已关闭