有序链表合并的递归和非递归算法

来源:互联网 发布:2004年3d开奖数据 编辑:程序博客网 时间:2024/05/21 09:21


首先是递归算法,形参是两个链表第一个结点的指针。


  1. Node* mergAction(Node* head1,Node *head2)  
  2. {  
  3.    Node *p=NULL;  
  4.    if(head1==NULL&&head2==NULL)  
  5.        return p;  
  6.    else if(head1==NULL)  
  7.        return head2;  
  8.    else if(head2==NULL)  
  9.        return head1;  
  10.    else  
  11.    {  
  12.         if(head1->data < head2->data)  
  13.         {  
  14.             p = head1;  
  15.             p->next = mergAction(head1->next,head2);  
  16.         }  
  17.         else  
  18.         {  
  19.            p = head2;  
  20.            p->next = mergAction(head1,head2->next);  
  21.         }  
  22.         return p;  
  23.    }  
  24. }  
然后是非递归的,
  1. #include "stdafx.h"  
  2. #include <malloc.h>  
  3.   
  4. typedef char DATA_TYPE;  
  5. typedef struct node   
  6. {  
  7.     DATA_TYPE data;  
  8.     struct node *next;  
  9. }LIST_NODE;  
  10. typedef LIST_NODE *plist;  
  11.   
  12. plist CreateList()  
  13. {  
  14.     plist phead,p,r;  
  15.     DATA_TYPE ch;  
  16.     phead=(plist)malloc(sizeof(LIST_NODE));  
  17.     r=p=phead;  
  18.     while ((ch=getchar())!='/n')  
  19.     {  
  20.         p=(plist)malloc(sizeof(LIST_NODE));  
  21.         p->data=ch;  
  22.         r->next=p;  
  23.         r=p;  
  24.     }  
  25.     p->next=NULL;  
  26.     return phead;  
  27. }  
  28.   
  29. void MergeList(plist &pha, plist &phb, plist &phc)  
  30. {  
  31.     plist pa,pb,pc;  
  32.     pa=pha->next;  
  33.     pb=phb->next;  
  34.     pc=phc=pha;  
  35.     while(pa && pb)  
  36.     {  
  37.         if (pa->data<=pb->data)  
  38.         {  
  39.             pc->next=pa;  
  40.             pc=pa;  
  41.             pa=pa->next;  
  42.         }  
  43.         else  
  44.         {  
  45.             pc->next=pb;  
  46.             pc=pb;  
  47.             pb=pb->next;  
  48.         }  
  49.     }  
  50.     pc->next=pa ? pa : pb;  
  51.     free(phb);  
  52. }  
  53.   
  54. void ShowList(plist phead)  
  55. {  
  56.     plist p;  
  57.     p=phead->next;  
  58.     printf("--------------------------------------------------/n");  
  59.     while(p)  
  60.     {  
  61.         printf("%c  ",p->data);  
  62.         p=p->next;         
  63.     }  
  64.     printf("/n");  
  65. }  
  66.   
  67. int _tmain(int argc, _TCHAR* argv[])  
  68. {  
  69.     plist pa,pb,pc;  
  70.     pc=NULL;  
  71.     pa=CreateList();  
  72.     pb=CreateList();  
  73.     MergeList(pa,pb,pc);  
  74.     ShowList(pc);  
  75.     return 0;  
  76. }  
0 0