Ah, this reminds me of a beautiful thing that a fine gentleman CB
Falconer posted once in comp.programmer.  It was so elegant that my
normally bad memory still remembers it after some years.

You can simplify the merge by using a dummy node for the head of the
merged list rather than just a pointer.  There was a question about
sentinels in another thread. This is similar.

struct node* SortedMerge(struct node* a, struct node* b)
{
  struct node head[1], *tail;

  // Since head is a dummy, head->next will be the "real" list head.
  head->next = NULL;
  tail = head;

  // Merge lists
  while(a && b)
  {
    if (a->data < b->data)
    {
      tail->next = a;
      tail = a;
      a = a->next;
    }
    else
    {
      tail->next = b;
      tail = b;
      b = b->next;
    }
  }
  // Attach remaining list
  tail->next = a ? a : b;
  return head->next;
}

On Feb 23, 3:49 pm, Don <dondod...@gmail.com> wrote:
> // Iterative merge
> struct node* SortedMerge(struct node* a, struct node* b)
> {
>   struct node* head, tail;
>
>   // Select first node
>   if (a->data < b->data)
>   {
>     head = tail = a;
>     a = a->next;
>   }
>   else
>   {
>     head = tail = b;
>     b = b->next;
>   }
>
>   // Merge lists
>   while(a && b)
>   {
>     if (a->data < b->data)
>     {
>       tail->next = a;
>       a = a->next;
>     }
>     else
>     {
>       tail->next = b;
>       b = b->next;
>     }
>   }
>   // Attach remaining list
>   tail->next = a ? a : b;
>   return head;
>
> }
>
> On Feb 23, 3:41 am, rahul sharma <rahul23111...@gmail.com> wrote:
>
>
>
> > 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 : 10 20 30
>
> > b : 10 25  35
> > wats the o/p??? 10 20 25 30 35
> > or 10 10 20 25 30????- Hide quoted text -
>
> - Show quoted text -

-- 
You received this message because you are subscribed to the Google Groups 
"Algorithm Geeks" group.
To post to this group, send email to algogeeks@googlegroups.com.
To unsubscribe from this group, send email to 
algogeeks+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/algogeeks?hl=en.

Reply via email to