#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;
}
两个有序链表合并为一个有序链表
最新推荐文章于 2023-12-22 20:26:38 发布