I have the following code to merge two sorted linked lists:
struct node* merge(struct node* a, struct node* b)
{
struct node dummy;
struct node* tail = &dummy;
dummy.next = NULL;
while(1)
{
if(a == NULL)
{
tail->next = b;
break;
}
else if (b == NULL)
{
tail->next = a;
break;
}
if (a->data <= b->data)
{
MoveNode(&(tail->next), &a);
}
else
{
MoveNode(&(tail->next), &b);
}
tail = tail->next;
}
return(dummy.next);
}
void MoveNode(struct node** destRef, struct node** sourceRef)
{
struct node* newNode = *sourceRef;
*sourceRef = newNode->next;
newNode->next = *destRef;
*destRef = newNode;
}
And it worked fine. I was trying to make it into a recursive method and this is what I got:
struct node* Merge(struct node* a, struct node* b)
{
struct node* result;
if (a == NULL)
return(b);
else if (b==NULL)
return(a);
if (a->data <= b->data)
{
result = Merge(a->next, b);
}
else
{
result = Merge(a, b->next);
}
return(result);
}
But it has many of the nodes missing in the result. What is wrong?
Your base conditions are correct. But there is problem with your recursive condition.
When you compare
a‘s data withb‘s data you are not copying nodeaor nodebintoresult.Try: