zoukankan      html  css  js  c++  java
  • [Algorithm] Find merge point of two linked list

    Assume we have two linked list, we want to find a point in each list, from which all the the nodes share the same value in both list. Then we call this point is "merge point".

     In the iamge, the merge point shoud be Node(7). 

      // Link A length 4, Link B length 5
      // All the node after the merge point should be the same
      // based on that, we can make sure that the merge point should
      // happens in range [x, c] or [y, c], it is not possible to happen at z
      // A      x - x - c - c
      // B  z - y - y - c - c
    function Node(val) {
      return {
        val,
        next: null
      };
    }
    
    function Link() {
      return {
        head: null,
        tail: null,
        length: 0,
        add(val) {
          const newNode = new Node(val);
    
          if (this.length === 0) {
            this.head = newNode;
            this.tail = newNode;
            this.tail.next = null;
          } else {
            let temp = this.tail;
            this.tail = newNode;
            temp.next = this.tail;
          }
    
          this.length++;
        }
      };
    }
    
     // O ( m + n ), Space: O(1)
    function findMergePoint(a, b) {
      // Link A length 4, Link B length 5
      // All the node after the merge point should be the same
      // based on that, we can make sure that the merge point should
      // happens in range [x, c] or [y, c], it is not possible to happen at z
      // A      x - x - c - c
      // B  z - y - y - c - c
      let diff, headA = a.head, headB = b.head;
      if (a.length > b.length) { // O(1)
        diff = a.length - b.length; 
        [a, b] = [b, a];
      } else {
        diff = b.length - a.length;
      }
    
      // reach +diff step for longer 
      for (let i = 0; i < diff; i++) {
        headB = headB.next; // O(m)
      }
    
      while (headA != null && headB.val != null ) { // O(n)
        if (headA.val === headB.val) {
          return headA;
        }
    
        headA = headA.next;
        headB = headB.next;
      } 
    
      return null;
    }
    
    const lA = new Link();
    lA.add(4);
    lA.add(6);
    lA.add(7);
    lA.add(1);
    
    const lB = new Link();
    lB.add(9);
    lB.add(3);
    lB.add(5);
    lB.add(7);
    lB.add(1);
    
    console.log(findMergePoint(lA, lB)); // Object {val: 7, next: Object}
  • 相关阅读:
    Qt的.pro文件
    AI_八数码
    安装 MINGW GCC 4.4.0
    VC中应用Excel
    八数码问题_启发搜索
    【收集】【收藏】【转帖】game development resouce
    QT小记之在VS2005中使用QT
    [转文]VS2008 安装 Boost 1.43.0
    搬家到博客园了
    转 暴雪总裁总结游戏十条经验
  • 原文地址:https://www.cnblogs.com/Answer1215/p/10650273.html
Copyright © 2011-2022 走看看