将两个有序链表合并成一个有序链表——搜狐畅游笔试题归来

                                                                                合并两个有序链表

递归实现:

      ①算法思想:

      递归终止条件:若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:
 int data;
 Node * next;
 Node(int data)
 {
  this->data=data;
 }
};

 

/*链表的类定义*/
class LinkedList
{
public:
 Node * head;

 

 /*用一个整形数组作为参数的构造函数*/
 LinkedList(int array[])
 {
  head=new Node(array[0]);
  Node * temp=head;
  int i;
  for(i=1;i<3;i++)
  {
   temp->next=new Node(array[i]);
   temp=temp->next;
  }
  temp->next=NULL;
 }
};

 

/*递归的合并两个有序链表*/
Node * mergeLinkedList(Node * head1,Node * head2)  
{  
   Node *p=NULL;  
   if(head1==NULL&&head2==NULL)  
       return p;  
   else if(head1==NULL)  
       return head2;  
   else if(head2==NULL)  
       return head1;  
   else 
   {  
       if(head1->data < head2->data)  
       {  
           p = head1;  
           p->next = mergeLinkedList(head1->next,head2);  
       }  
       else 
    {
          p = head2;  
    p->next = mergeLinkedList(head1,head2->next);  
    }  
       return p;  
   }  

 

/*打印链表的所有元素*/
void printList(Node * head)
{
 Node * temp=head;
 while(temp!=NULL)
 {
  cout<<temp->data<<"  ";
  temp=temp->next;
 }
}

 

int main()
{
 int array1[3]={2,5,8};
 int array2[3]={1,6,7};

 

 /*构造两个有序链表--list1和list2*/
 LinkedList list1(array1);
 LinkedList list2(array2);

 

 /*递归的将这两个有序链表合并成一个有序链表*/
 Node * new_head=mergeLinkedList(list1.head,list2.head);

 

 /*打印有序链表*/
 printList(new_head);

 return 0;
}

 

                                                                           实现memmove函数

 

 

#include <stdio.h>

 

/*函数功能与memmove相同。*/
void * Mymemmove(void * dest,const void * src,size_t count)
{
 if(dest==NULL||src==NULL)
  return NULL;

 char * dest_p=(char *)dest;
 char * src_p=(char *)src;

 

 /*目标地址小于源地址,从前向后复制*/
 if(dest<src)
 {
  while(count--)
   *dest_p++=*src_p++;
 }

 

 /*目标地址大于源地址,从后向前复制*/
 else if(dest>src)
 {
  dest_p+=count-1;
  src_p+=count-1;
  while(count--)
   *dest_p--=*src_p--;
 }
 return dest;
}

 

void main()
{
 char src[6]={'a','b','c','d','e','f'};
 Mymemmove(&src[2],src,4);

 /*打印源字符串*/
 int i;
 for(i=0;i<6;i++)
  printf("%c",src[i]);
 printf("/n");
}

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值