1. 程式人生 > >將兩個單鏈表合併成一個單鏈表,L1,L2 —>L3

將兩個單鏈表合併成一個單鏈表,L1,L2 —>L3

將兩個單鏈表合併成一個單鏈表

假設L1=(x1,x2,x3……Xn)長度為n

L2=(y1,y2,y3………Ym)長度為m

若m<n,則L3=(x1,y1,x2,y2,x3,y3………………Xn,Yn,Yn+1,Yn+2……Ym);

若m>n,則L3=(x1,y1,x2,y2,x3,y3………………Xm,Ym,Xm+1,Xm+2……Xn);

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <malloc.h>
using namespace std;
typedef struct Node{//單鏈表型別
    int data;
    struct Node *next;
}List;

void Create_List(List *&L,int x){//用來建立普通單鏈表L1,L2
    List *s,*r;
    L=(List *)malloc(sizeof(List));
    L->next=NULL;
    r=L;//尾插法建立
    for(int i=0;i<x;i++)
    {
        s=(List *)malloc(sizeof(List));
        scanf("%d",&s->data);
        r->next=s;
        r=s;
    }
    r->next=NULL;
}
//下面的Connect——List函式是用來連結L1,L2,與本題無關
/*void Connect_List(List *&L,List *&L2,int m,int n){
    List *l=L;
    List *q=L2;
    for(int i=0;i<n;i++)
    {
        l=l->next;
    }
    l->next=q->next;
}*/
void Print(List *&L,int n){//列印連結串列的函式
    List *p=L->next;//跳過頭結點到 首結點
    while (p!=NULL)//結點不為空,繼續
    {
        printf("%d ",p->data);
        p=p->next;
    }
}/*
    利用L1,L2產生新的連結串列L3
    L1長度為N,L2長度為M
    先判斷L1,l2那條鏈段,去長度為mini
    假設M為的較大,N為較小的,temp=0,尚未交換
    所以隨後第二個for迴圈,為L3鏈賦L2的值
    若是N較大,則交換他們兩個
    介值temp這時就不為0,了
    所以隨後第二個for迴圈,為L3鏈賦L1的值
*/
void CreatList3(List *&L1,List *&L2,List *&L3,int m,int n){
    List *l=L1->next;
    List *q=L2->next;
    //List *h=L3;
    int mini,temp=0;
    if(m<n){
        temp=m;
        m=n;
        n=temp;
    }
    mini=temp;
    List *s,*r;
    L3=(List *)malloc(sizeof(List));
    L3->next=NULL;
    r=L3;
    for(int i=0;i<mini;i++)
    {
        s=(List *)malloc(sizeof(List));
        s->data=l->data;
        l=l->next;
        r->next=s;
        r=s;
        s=(List *)malloc(sizeof(List));
        s->data=q->data;
        q=q->next;
        r->next=s;
        r=s;
    }
    for(int j=0;j<(m-mini);j++){
        if(temp!=0){
            s=(List *)malloc(sizeof(List));
            s->data=l->data;
            l=l->next;
            r->next=s;
            r=s;
        }else{
            s=(List *)malloc(sizeof(List));
            s->data=q->data;
            q=q->next;
            r->next=s;
            r=s;
        }

    }
    r->next=NULL;
}

int main(){
    List *L1,*L2,*L3;
    int n,m;
    L1=(List *)malloc(sizeof(List));
    L2=(List *)malloc(sizeof(List));
    L3=(List *)malloc(sizeof(List));
    cin>>n;
    Create_List(L1,n);
    cin>>m;
    Create_List(L2,m);
    CreatList3(L1,L2,L3,m,n);
    Print(L3,n);
    free(L3);
    //Connect_List(L1,L2,m,n);
    //Print(L1,n);
    //free(L1);
    return 0;
}

C++:將兩個單鏈表合併成一個單鏈表