///方法一
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;
}
合并有序链表
最新推荐文章于 2025-05-07 08:00:00 发布
本文介绍了一种将两个已排序的链表合并成一个有序链表的算法,并提供了三种不同的实现方式,包括直接迭代、宏定义辅助迭代及使用lambda表达式进行迭代。
513

被折叠的 条评论
为什么被折叠?



