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}
  • 相关阅读:
    kafka 启动失败
    spring boot 集成 hbase
    Spring Boot Restful 乱码
    自动化工具selenium
    spring boot mssqlserver
    pyqt5
    python bytes to string
    jQuery获取Select选择的Text和 Value(转)
    第二周读书笔记《构建之法》
    第三周读书笔记《程序员修炼之道》
  • 原文地址:https://www.cnblogs.com/Answer1215/p/10650273.html
Copyright © 2011-2022 走看看