美文网首页
算法练习7:求两个单链表的相交点

算法练习7:求两个单链表的相交点

作者: miao8862 | 来源:发表于2021-04-11 23:56 被阅读0次

两个单链表,相交,会成为一个横躺的Y形状,求它们的交点

// 初始化链表:
// node1: 1 -> 2 -> 3 -> 4
//                          -> 5
// node2: 6 -> 7 ------> 4

// 链表节点
function LinkNode(val) {
  this.val = val;
  this.next = null;
}

const node1 = new LinkNode(1)
const node2= new LinkNode(2)
const node3 = new LinkNode(3)
const node4 = new LinkNode(4)
const node5 = new LinkNode(5)
node1.next = node2
node2.next = node3
node3.next = node4
node4.next = node5

const node6 = new LinkNode(6)
const node7 = new LinkNode(7)
node6.next = node7
node7.next = node4

暴力解法

双层遍历,查看一个链表里是否有与另一个链表相同的节点地址,有的话,这个点就是它们相交点;

  • 时间复杂度:O(n^2)
  • 空间复杂度:O(1)
function getSameNode(node1, node2) {
  let p1 = node1;
  let p2 = node2;
  while(p1) {
    p2 = node2;
    while(p2) {
      if(p2.next === p1) {
        return p1
      }
      p2 = p2.next
    }
    p1 = p1.next
  }
  return null;
}

console.log(getSameNode(node1, node6)); // LinkNode { val: 4, next: LinkNode { val: 5, next: null } }

使用hash表

使用hash表来存储任意一个链表所有的节点地址,然后在遍历另一个链表,如果其某个节点在hash表中,这个点就是它们的相交点

  • 时间复杂度:O(n+m),约为O(n)
  • 空间复杂度:O(n)
function getSameNode2(node1, node2) {
  let map = new Map()
  while(node1) {
    map.set(node1, 1)
    node1 = node1.next
  }
  while(node2) {
    if(map.has(node2)) {
      return node2;
    }else {
      node2 = node2.next
    }
  }
  return null;
}

console.log(getSameNode2(node1, node6)); // LinkNode { val: 4, next: LinkNode { val: 5, next: null } }

利用链表长度差k

先遍历2个链表node1、node2,分别获取2个链表的长度,假设node1长度较大,计算两个链表的差距k,然后遍历长链表,到第k位后,长短链表此时和短链表后面的长度一致了,此时继续同时遍历长链表和短链表,当它们的节点相同时,就是它们的相交点

  • 时间复杂度:O(2n+m), 约为O(n)
  • 空间复杂度:常量级,O(1)
function getSameNode3(node1, node2) {
  let len1 = 0;
  let len2 = 0;
  let p1 = node1; // p1指针,初始指向链表1的头节点
  let p2 = node2; // p2指针,初始指向链表2的头节点
  let k;
  // 计算链表1的长度
  while(p1) {
    len1 ++;
    p1 = p1.next
  }
  // 计算链表2的长度
  while(p2) {
    len2++;
    p2 = p2.next
  }
  // 计算两链表的长度差k,p1改指向长链表的头节点,p2改指向短链表的头节点
  if(len1 >= len2) {
    k = len1 - len2;
    p1 = node1
    p2 = node2
  }else {
    k = len2 - len1;
    p1 = node2;
    p2 = node1;
  }
  // 遍历长链表
  while(p1) {
    // 长链表先单独移动k位
    if(k !== 0) {
      k--;
      p1 = p1.next;
      // 移到k位后,两链接指针开始同时移动,查找相同节点
    }else {
      if(p1 !== p2) {
        p1 = p1.next
        p2 = p2.next
      }else {
        return p1;
      }
    }
  }
  return null;
}

console.log(getSameNode3(node1, node6)); // LinkNode { val: 4, next: LinkNode { val: 5, next: null } }

相关文章

  • 算法练习7:求两个单链表的相交点

    两个单链表,相交,会成为一个横躺的Y形状,求它们的交点 暴力解法 双层遍历,查看一个链表里是否有与另一个链表相同的...

  • 经典面试题之链表

    《程序员面试金典》p49,2.6, 求单链表环路的入口结点。 相关题目:给定两个单链表,求他们的共同交点。解法:(...

  • 求两个链表的交点

    已知链表A的头节点指针headA,链表B的头节点指针headB,两个链表相交,求两链表交点对应的节点。[](Lee...

  • 2.求两个链表的交点

    已知链表A的头结点指针headA,链表B的头结点指针headB,两个链表相交,求两链表交点对应的节点。 注意: 如...

  • Swift - LeetCode - 相交链表

    题目 相交链表 问题: 编写一个程序,找到两个单链表相交的起始节点。 示例: 说明: 如果两个链表没有交点,返回 ...

  • 算法:两个无环单链表的交点

    问题描述: 题目给定信息:题目中给出两个链表,这两个链表有一部分节点是相互重合的,我们的目的就是要找到两个链表重合...

  • Day19

    Intersection of Two Linked Lists**思路:没有读懂题目的含义,找到两个单链表的交点...

  • 相交链表

    相交链表 编写一个程序,找到两个单链表相交的起始节点。 注意: 如果两个链表没有交点,返回 null. 在返回结果...

  • 相交链表

    编写一个程序,找到两个单链表相交的起始节点。 注意: 如果两个链表没有交点,返回 null.在返回结果后,两个链表...

  • 算法题面试复习

    算法模块 1. 链表 1. 链表翻转 2. 单链表判断是不是环+求环位置+求环长度 以图片为例,假设环入口距离链表...

网友评论

      本文标题:算法练习7:求两个单链表的相交点

      本文链接:https://www.haomeiwen.com/subject/rettlltx.html