归并链表(简单方法)

Posted nnyst

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了归并链表(简单方法)相关的知识,希望对你有一定的参考价值。

/*
问题描述:A和B是两个单链表(带头结点) 
其中元素递增有序,设计一个算法,将A,B归并成一个按元素值非递减有序的链表C
C由A,B中的结点构成 
*/ 

#include<stdio.h>
#include<malloc.h>

typedef struct LNode
    int data;
    struct LNode* next;
LNode,*LinkList; 

//头插法构建单链表(输出时与创建顺序相反) 
void init1(LinkList &L)
    //一定要给L动态开辟空间,并且让 L->next = NULL;
    L = (LinkList)malloc(sizeof(LinkList));
    L->next = NULL;
    LinkList s;
    int x;
    scanf("%d",&x);
    while(x!=-1)
        s = (LinkList)malloc(sizeof(LinkList));
        s->data = x;
        s->next = L->next;
        L->next = s;
        scanf("%d",&x);
    
 

//尾插法构建单链表
void  init2(LinkList &L)
    L = (LinkList)malloc(sizeof(LinkList));
    L->next = NULL;
    LinkList s,r;
    r = L;
    int x;
    scanf("%d",&x);
    while(x!=-1)
        s = (LinkList)malloc(sizeof(LinkList));
        s->data = x;
        r->next = s;
        r = s;
        scanf("%d",&x);
    
    s->next = NULL;


void merge(LinkList a,LinkList b,LinkList &c)
    LinkList p,q,s,r;
    p = a->next;
    q = b->next;
    c = (LinkList)malloc(sizeof(LinkList));
    c->next = NULL;
    r = c;
    
    while(p!=NULL&&q!=NULL)
        s = (LinkList)malloc(sizeof(LinkList));
        if(p->data<q->data)
            s->data = p->data;
            printf("=========%d\n",s->data );
            r->next = s;
            r = s;
            //只动一个指针,切记 
            p = p->next;
        else
            s->data = q->data;
            printf("++++++++++%d\n",s->data );
            r->next = s;
            r = s;
            //只动一个指针,切记 
            q = q->next;
        
    
    if(p!=NULL)
        s = (LinkList)malloc(sizeof(LinkList));
        s->data = p->data;
        r->next = s;
        r = s;
        //只动一个指针,切记 
        p = p->next;
    else
        s = (LinkList)malloc(sizeof(LinkList));
        s->data = q->data;
        r->next = s;
        r = s;
        //只动一个指针,切记 
        q = q->next;
    
    r->next=NULL;

 
//输出链表中的元素
void show(LinkList L)
    LinkList p = L->next; 
    while(p)
        printf("%d   ",p->data);
        p = p->next;
    
 

int main()
//    LinkList L;
////    //头插法测试 
////    init1(L);
////    //尾插法插法测试 
////    init2(L);
//    
//    show(L);
    LinkList a,b,c; 
    printf("请输入链表a的元素:"); 
    init2(a);
    printf("\n"); 
    printf("请输入链表b的元素:"); 
    init2(b);
    printf("\n"); 
    merge(a,b,c);
    show(c);
    return 0;
 

 

以上是关于归并链表(简单方法)的主要内容,如果未能解决你的问题,请参考以下文章

为链表排序量身定做的算法--归并排序

力扣21.合并两个有序链表

java.util.ComparableTimSort中的sort()方法简单分析

148 Sort List 链表上的归并排序和快速排序

知识点总结报告 1.26

对多个有序数组,实现归并操作