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

来源:互联网 发布:单片机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;}

原创粉丝点击