链表3——相交链表160
作者:互联网
解法:双指针,空间复杂度O(1)
创建两个指针pA和pB,初始分别指向两个链表的头节点headA和headB,然后将两个指针依次遍历两个链表,如果某指针为空,则将指针移到另一个链表的链头,当两个指针都指向同一个节点或者null时,return。
正确性的证明:
(1)假设两个链表相交:
#1 不相交部分相等,则会同时到达两个链表相交的节点
#2 不相交部分不等,则在执行a+c+b次后,一定会在相交节点相遇
(2)假设两个链表不相交
#1 长度相等,则同时到达链尾,返回Null
#2 长度不等,则运行m+n次后,会返回Null
const getNode = (headA, headB) => {
if (!headA || !headB) return null; // 链表为空,一定不相交
let pa = headA,
pb = headB;
while (pa !== pb) {
pa = (pa === null) ? headB : pa.next; // 指针继续遍历 or 指向另外一条链表的链头
pb = (pb === null) ? headA : pb.next;
}
return pa; // null 或者 相交节点
}
标签:相交,链表,pa,headB,headA,160,指针 来源: https://blog.csdn.net/huaf_liu/article/details/120385866