两个有序的单链表融合

数据结构练习
本文的融合方法引用 https://blog.csdn.net/lishun1422840684/article/details/77984583

typedef 
struct node
{
  int data;
  struct node* next;    
}Node;

void Create(Node**);
Node * Merge(Node*,Node*);
void Output(Node*); 

int main(void) 
{
    Node *head1 = NULL;
    Node *head2 = NULL; 
    Create( & head1 );
    Create( & head2 );
    Output( Merge ( head1 , head2 ) );
    return 0;
}

void Create (Node** p_head)//尾插法 
{
    printf("输入数据输入零即停止\n");
    int key;
    scanf("%d",&key);
    Node * last = NULL; 
    while( key )
    {
        Node * p = malloc(sizeof(Node));
        p -> data = key;
        if(* p_head == NULL)
        {
             p->next = * p_head;
            * p_head = p;
             last = p;
        }else{
            last -> next = p;
            p -> next = NULL;
            last = p;
        }
        scanf("%d",& key);
    }
}

Node* Merge (Node * head1,Node * head2)//从小到大排序 
{
   Node * head;

   if( ! head1)//特殊情况 
   {
     return head2;  
   }

   if(! head2)
   {
    return head1;
   }

   Node *p1 = head1;
   Node *p2 = head2;

   if(head1 -> data <= head2 -> data)//这一步不可缺少 
   {
     head = p1;
     p1 = p1 -> next;
   }
   else
   {
    head = p2;
    p2 = p2->next;
   }

   Node * p = head;

   while( p1 && p2 )//普通情况 
   {

     if( p1 -> data <= p2 -> data )
     {
       p -> next = p1;
       p1 = p1 -> next; 
     }
     else
     {
        p -> next= p2;
        p2 = p2 -> next;
     }
     p = p -> next; 
   }

   if( p1 )//尚有剩余没有排序完的情况 
   {
    p -> next= p1;
   }

   if( p2 )
   {
    p -> next= p2; 
   } 

   return head;
}

void Output(Node * head)
{
    Node * p = head;

    while( p )
    {
        printf("%d ",p -> data);
        p = p -> next;
    }

    putchar('\n');
}

总结:这种融合,并不完美,这并没有去重,虽然没有重新再定义一个新的链表,但还是要了一个指针白白占了四个字节的空间。有问题欢迎提问。

猜你喜欢

转载自blog.csdn.net/weixin_40867255/article/details/82728676