问题定义:
写一个函数SortedMerge函数,该函数有两个参数,都是递增的链表,函数的功能就是合并这两个递增的链表为一个递增的链表,SortedMerge的返回值是新的链表。新链表由前两个链表按元素递增顺序合并而成,也就是说它不会创建新的元素。
比如:这里有两个链表,分别是
list1: 5->10->15
list2: 2->3->20
SortedMerge函数返回一个指向新链表的指针,新链表应该是如下这样的:2->3->5->10->15->20
程序需要考虑如下情况:两个链表(函数参数)都有可能为空,也可能其中一个链表已经遍历完了,另一个链表还有很多元素。
struct node* SortedMerge(struct node* a, struct node* b)
{
struct node* result = NULL;
/*Base cases*/
if(a == NULL)
return (b);
else if(b == NULL)
return (a);
/*Pick either a or b, and recur */
if(a->data <= b->data)
{
result = a;
result->next = SortedMerge(a->next, b);
}
else
{
result = b;
result->next = SortedMerge(a, b->next);
}
return (result);
}
对两个元素递增有序的单链表A 和 B编写算法将A、B合并成一个按元素递减有序(允增加新节点许有相同值)的单链表 C
void Merge(LNode *A,LNode *B,LNode **C)
{
LNode *p,*q,*s;
p=A->next;
q=B->next;
(*C)=A;
(*C)->next=NULL;
free(B);
while(p!=NULL&&q!=NULL)
{
if(p->data<q->data)
{
s=p;
p=p->next;
}
else
{
s=q;
q=q->next;
}
//cha ru
s->next=(*C)->next;
(*C)->next=s;
}
if(p==NULL)
p=q;
while(p!=NULL)
{
s=p;
p=p->next;
s->next=(*C)->next;
(*C)->next=s;
}
}