合并两个有序单链表

来源:互联网 发布:单片机正弦波 编辑:程序博客网 时间:2024/05/29 08:07

把两个有序单链表合并为一个,在网上查了不少相关文章,觉得有一篇写的比较好,但是感觉有两行代码写错了

原帖:http://fayaa.com/code/view/12171/

我自己改了一下

 

#include <stdio.h>#include <string.h>#include <stdlib.h>typedef struct _Node{int value;struct _Node *next;}Node, *PNode;PNode BuildLink(int n, int *pi);   //构造一个节点数为n的链表PNode MergeLink(PNode p1, PNode p2);//合并void OutputLink(PNode ph);int main(){int a[] = {2, 4, 9, 12, 45, 78,100};int b[] = {3, 4, 11, 29, 55, 120, 200, 222};PNode p1 = BuildLink(sizeof(a)/sizeof(int), a);PNode p2 = BuildLink(sizeof(b)/sizeof(int), b);OutputLink(p1);OutputLink(p2);PNode pMerge(p1, p2);OutputLink(pMerge);getchar();return 0;}PNode BuildLink(int n, int *pi)  //建立链表{int i;PNode ph = Null, pn;   //ph头指针,pn当前结点for(i=0; i<n; i++){if(!(pn=(PNode)malloc(sizeof(PNode)))) //分配空间{printf("malloc error.\n");return(1);}pn->value = *(pi+n-i-1);  //链表的插入算法pn->next = ph;ph->next = pn;}return ph;}void OutputLink(PNode ph){while(ph){printf("%d ", ph->value);ph = ph->next;}printf("\n");}PNode MergeLinkK(PNode p1, PNode p2) //不需要再分配空间,只使用原有p1,p2的空间{if(!p1) return p2;  //如果一个链表为空,返回另一个if(!p2) return p1;PNode ph, p;  //p指向合并后的链表的当前节点if(p1->value < p2->value) //  如果p1<p2,以p1为基础建立{ph = p1;p = p1;p1 = p1->next;}else{ph = p2;p = p2;p2 = p2->next;}while(p1 && p2)  //p1,p2 不为空{if(p1->value < p2->value) //插入节点{p->next = p1;p = p1;p1 = p1->next;}else{p->next = p2;p = p2;p2 = p2->next;}}if(!p1) p->next = p2;if(!p2) p->next = p1;return ph;}



原创粉丝点击