把两个有序单链表合并为一个,在网上查了不少相关文章,觉得有一篇写的比较好,但是感觉有两行代码写错了
原帖: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;
}