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

合并两个有序链表

 

 

递归实现:

 

      ①算法思想:

 

      递归终止条件:若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");

}

 

 

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/piaojun_pj/archive/2010/10/17/5946801.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值