您的位置:首页 > 其它

两个有序链表序列的合并

2017-11-08 21:51 405 查看


本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个非递减的整数序列。


函数接口定义:

List Merge( List L1, List L2 );

其中
List
结构定义如下:
typedef struct Node *PtrToNode;
struct Node {
ElementType Data; /* 存储结点数据 */
PtrToNode   Next; /* 指向下一个结点的指针 */
};
typedef PtrToNode List; /* 定义单链表类型 */

L1
L2
是给定的带头结点的单链表,其结点存储的数据是递增有序的;函数
Merge
要将
L1
L2
合并为一个非递减的整数序列。应直接使用原序列中的结点,返回归并后的链表头指针。


裁判测试程序样例:

#include <stdio.h>
#include <stdlib.h>

typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
ElementType Data;
PtrToNode Next;
};
typedef PtrToNode List;

List Read(); /* 细节在此不表 */
void Print( List L ); /* 细节在此不表;空链表将输出NULL */

List Merge( List L1, List L2 );
int main()
{
List L1, L2, L;
L1 = Read();
L2 = Read();
L = Merge(L1, L2);
Print(L);
Print(L1);
Print(L2);
return 0;
}

/* 你的代码将被嵌在这里 */


#include <stdio.h>
#include <stdlib.h>
#include<iostream>
using namespace std;
typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
ElementType Data;
PtrToNode   Next;
};
typedef PtrToNode List;

List Read()
{
int n, m;
List L, tmp;
cin >> n;
//scanf("%d", &n);
L = (PtrToNode)malloc(sizeof(struct Node));
L->Next = NULL;//初始化结点
tmp = L;//在下面用tmp进行操作,这样后面就可以直接返回L
while (n--)
{
List node = (List)malloc(sizeof(struct Node));
cin >> m;
//scanf("%d", &m);
node->Data = m;
node->Next = NULL;//注意此处不可少
tmp->Next = node;
tmp = tmp->Next;
//free(node);//这里不能free node 好奇怪哟
}
return L;
}

void Print(List L)
{
if (L == NULL)
{
cout << " NULL";
//printf("NULL");
}
else
{
L = L->Next;//跳过头结点
}
while (L)
{
cout << L->Data<<" ";
L = L->Next;
}
}

List Merge(List L1, List L2)
{
int tmp = 0;
List M, N;
List r, temp;
List a;
int b;
M = L1->Next;//跳过头结点
N = L2->Next;//跳过头结点
r = (PtrToNode)malloc(sizeof(struct Node));
r->Next = NULL;
temp = r;
while (M && N)
{
if (M->Data < N->Data)//因为M和N都有序,逐个比较两个链表中的数,小的加入新的链表
{
b = M->Data;
M = M->Next;//加入新链表的链表前进一个
}
else
{
b = N->Data;
N = N->Next;
}
a = (List)malloc(sizeof(struct Node));
a->Data = b;
a->Next = NULL;
temp->Next = a;
temp = temp->Next;
}
while (M)
{
temp->Next = M;
M = M->Next;
temp = temp->Next;
}
while (N)
{
temp->Next = N;
N = N->Next;
temp = temp->Next;
}//M或者N中剩下的数在加入新链表
temp->Next = NULL;
return r;
}

int main()
{
List L1, L2, L;
L1 = Read();
L2 = Read();
L = Merge(L1, L2);
L1 = NULL;
L2 = NULL;
Print(L);
Print(L1);
Print(L2);
return 0;
}


代码基本框架来自这里http://blog.csdn.net/qq_24942951/article/details/61210444,在此基础上进行了一些删改,加入了一些自己的思考。

向原博主表示感谢。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  函数 链表 合并