合并两个有序链表 (C++)

本文详细介绍了如何使用递归算法合并两个有序链表,并通过实现memmove函数展示了内存操作技巧。主要内容包括链表的基本操作、递归算法的应用以及C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 合并两个有序链表

递归实现:

      ①算法思想:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值