code: private void combine(
      GBSNode       p,
      GBSNode       f)
    {
                                     /* Size of gap in tail of sub-tree       */
      int gapWid = p.width() - p.population();
      GBSNode q = p;                 /* Last node visited                     */
      p.setRightChild(f);            /* Make sub-tree point to list           */
      p = f;                         /* Next node becomes current             */
      if (gapWid != 0)               /* Keys must be adjusted                 */
        {
          GBSNode lq = null;         /* Parent of last node visited           */
          while(p != null)           /* While q has a right child             */
          {
            q.fillFromRight();
            lq = q;
            q = p;
            p = p.rightChild();
          }
          if (q.population() != 0) {  /* Final node is non-empty              */
            q.adjustMedian();         /* Adjust its middle key                */
          }
          else {                      /* Final node is now empty              */
            lq.clearRightChild();     /* And can be got rid of                */
          }
        }
    }
docs: Append a linear list (formerly a fringe) to a sub-tree and fill the
  last node in the sub-tree from the linear list if the last node
  in the sub-tree is not already full.
  
  <p>A sub-tree is to have a former sub-tree (now a linear list)
  appended to it.  Both the sub-tree and the list will probably have
  terminal nodes that are partially full.  If the sub-tree has a
  terminal node that is not full, then all keys in the list must be
  moved left in order to fill up the sub-tree.</p>
  
  @param p Tail of sub-tree.
  @param f Head of list to add.