给你两个有序链表,编写一个函数,把两个链表合并成一个新的有序链表,返回头指针

给你两个有序链表,编写一个函数,把两个链表合并成一个新的有序链表,返回头指针。(要求一分钟内给出两个算法)

递归算法所体现的“重复”一般有三个要求:

  一是每次调用在规模上都有所缩小(通常是减半);

  二是相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入);

三是在问题的规模极小时必须用直接给出解答而不再进行递归调用,因而每次递归调用都是有条件的(以规模未达到直接解答的大小为条件),无条件递归调用将会成为死循环而不能正常结束。

如何设计递归算法

  1.确定递归公式

  2.确定边界(终了)条件递归实现:

①算法思想:

     递归终止条件:若head1为空,返回head2指针(head);若head2为空,返回head1指针(head)

     递归过程:

     (1)若head1->data > head2->data;

         head 指针应该指向head2所指向的节点,而且head->next应该指向head1和head2->next两个链表的合成序列的头指针;

     (2)否则head 指针应该指向head1所指向的节点,而且head->next应该指向head->next和head2两个链表的合成序列的头指针;

②实现代码(C++):   

     #include <iostream>

     using namespace std;

    

     /*节点的类定义*/

     class Node

     {

         public:

              intdata;

              Node* next;

              Node(intdata)

              {

                   this->data=data;

              }

     };

 

     /*链表的类定义*/

     class LinkedList

     {

         public:

              Node* head;

         /*用一个整形数组作为参数的构造函数*/

         LinkedList(intarray[])

         {

              head=newNode(array[0]);

              Node* temp=head;

              inti;

              for(i=1;i<3;i++)

              {

                   temp->next=newNode(array[i]);

                   temp=temp->next;

              }

              temp->next=NULL;

         }

     };

 

     /*递归的合并两个有序链表*/

     Node * mergeLinkedList(Node * head1,Node * head2)  

     {  

         Node*p=NULL;  

         if(head1==NULL&& head2==NULL)  

              returnp;  

         elseif(head1==NULL)  

              return head2;  

         elseif(head2==NULL)  

              returnhead1;  

         else 

         {  

              if(head1->data< head2->data)  

              {  

                   p =head1;  

                   p->next =mergeLinkedList(head1->next,head2);  

              }  

              else 

              {

                   p= head2;  

                   p->next= mergeLinkedList(head1,head2->next);  

              }  

              returnp;  

         }  

     }

 

     /*打印链表的所有元素*/

     void printList(Node * head)

     {

         Node* temp=head;

         while(temp!=NULL)

         {

              cout<<temp->data<<"  ";

              temp=temp->next;

         }

     }

 

     int main()

     {

         intarray1[3]={2,5,8};

         intarray2[3]={1,6,7};

 

         /*构造两个有序链表--list1和list2*/

         LinkedListlist1(array1);

         LinkedList list2(array2);

 

         /*递归的将这两个有序链表合并成一个有序链表*/

         Node* new_head=mergeLinkedList(list1.head,list2.head);

    

         /*打印有序链表*/

         printList(new_head);

         return 0;

     }

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值