合并有序链表

///方法一
inline void iter_next(node* &pn)
{
  pn = pn->next;
}

void merge_order_list(node* phead1, node* phead2, node* &phead)
{
  if(NULL == phead1) { phead = phead2;  return;}
  if(NULL == phead2) { phead = phead1;  return;}

  node *pthead, *pmin;
  pthead = phead1->value < phead2->value? phead1: phead2;
  phead  = pthead;
  
  while (phead1 && phead2) {
    pmin = phead1->value < phead2->value ? phead1 : phead2;
    if(pthead->value != pmin->value) {
      pthead->next = pmin;
      iter_next(pthead);
    }          

    if(phead1->value < phead2->value) iter_next(phead1);
    else if(phead1->value > phead2->value) iter_next(phead2);
    else {
      iter_next(phead1);
      iter_next(phead2);
    }
  }

  phead1 = (NULL == phead1) ? phead2 : phead1;
  while(phead1) {
    pthead->next = phead1;
    iter_next(pthead);
    iter_next(phead1);
  }

  pthead->next = NULL;
}


///方法二
#define ITER_NEXT(pn) \
do { \
  pn = (pn)->next;\
} while(0)

#define NEXT(phead1, phead2, pthead) \
do {\
    if((pthead)->value != (phead1)->value) {\
      (pthead)->next = (phead1);\
      ITER_NEXT(pthead);\
    } \
    ITER_NEXT(phead1);\
    if((phead1)->value == (phead2)->value) ITER_NEXT(phead2);\
}while(0)

void merge_order_list(node* phead1, node* phead2, node* &phead)
{
  if(NULL == phead1) { phead = phead2;  return;}
  if(NULL == phead2) { phead = phead1;  return;}

  node *pthead = (phead1->value < phead2->value)? phead1: phead2;
  phead  = pthead;
  while(phead1 && phead2) {
    if(phead1->value < phead2->value)  NEXT(phead1,phead2,pthead);
    else NEXT(phead2, phead1,pthead);
  }

  phead1 = (NULL == phead1) ? phead2 : phead1;
  while(phead1) {
    pthead->next = phead1;
    ITER_NEXT(pthead);
    ITER_NEXT(phead1);
  }

  pthead->next = NULL;
}


//方法三
void merge_order_list(node* phead1, node* phead2, node* &phead)
{
    if(NULL == phead1) { phead = phead2;  return;}
    if(NULL == phead2) { phead = phead1;  return;}

    node *pthead = (phead1->value < phead2->value)? phead1: phead2;
    phead  = pthead;

    auto f = [&pthead](node* &phead1,node* &phead2) {
        if(pthead->value != phead1->value) {
            pthead->next = phead1;
            ITER_NEXT(pthead);
        }   
        ITER_NEXT(phead1);
        if(phead1->value == phead2->value) ITER_NEXT(phead2);
    };  

    while(phead1 && phead2) {
        if(phead1->value < phead2->value)  f(phead1,phead2);
        else f(phead2, phead1);
    }

    phead1 = (NULL == phead1) ? phead2 : phead1;
    while(phead1) {
        pthead->next = phead1;
        ITER_NEXT(pthead);
        ITER_NEXT(phead1);
    }

    pthead->next = NULL;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值