///方法一
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;
}
合并有序链表
最新推荐文章于 2024-09-23 15:55:32 发布