两个有序链表合并为一个有序链表
来源:互联网 发布:单片机lcd显示时间 编辑:程序博客网 时间:2024/05/17 22:44
#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;}