將兩個單鏈表合併成一個單鏈表,L1,L2 —>L3
阿新 • • 發佈:2019-01-10
將兩個單鏈表合併成一個單鏈表
假設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; }