您的位置:首页 > 其它

两个有序链表合并为一个有序链表

2013-10-27 16:24 295 查看
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>

using namespace std;

struct Node {
int val;
Node* next;
Node() { val = 0; next = NULL; }
};

Node* MergeList(Node* pfirst, Node* psecond) {
if (NULL == pfirst || NULL == psecond) {
fprintf(stderr, "MergeList: Invalid arguments");
exit(1);
}
Node* ret = NULL, *pn = NULL;
Node* pf = pfirst, *ps = psecond;
while (NULL != pf || NULL != ps) { // 利用归并思想
Node* pt = new Node();
if (NULL == ps) {
pt->val = pf->val;
pf = pf->next;
} else if (NULL == pf) {
pt->val = ps->val;
ps = ps->next;
} else { // 两个指针都不为空则选择小的放入返回链表
if (pf->val < ps->val) {
pt->val = pf->val;
pf = pf->next;
} else {
pt->val = ps->val;
ps = ps->next;
}
}
if (NULL == ret) {
ret = pt;
pn = pt;
} else {
pn->next = pt;
pn = pn->next;
}
}
return ret;
}

Node* BuildList(int* a, int n) {
if (NULL == a || 0 > n) {
fprintf(stderr, "BuildList: Invalid arguments");
exit(1);
}
Node* ret = NULL, *pn = NULL;
for (int i = 0; i < n; i++) {
Node* pt = new Node();
pt->val = a[i];
if (NULL == ret) {
ret = pt;
pn = pt;
} else {
pn->next = pt;
pn = pn->next;
}
}
return ret;
}

void PrintList(Node* phead) {
Node* pn = phead;
while (pn != NULL) {
printf("%d ", pn->val);
pn = pn->next;
}
printf("\n");
}

int main()
{
int a[] = {1, 3, 5, 9, 11};
int b[] = {2, 4, 6, 8, 10};
Node* pa = BuildList(a, 5);
PrintList(pa);
Node* pb = BuildList(b, 5);
PrintList(pb);

Node* pc = MergeList(pa, pb);
while (pc != NULL) {
printf("%d ", pc->val);
pc = pc->next;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: