您的位置:首页 > 理论基础 > 数据结构算法

PAT数据结构_02-线性结构1 两个有序链表序列的合并 (15分)

2016-11-26 20:47 716 查看
问题地址: https://pta.patest.cn/pta/test/1342/exam/3/question/19208
问题:编写函数Merge将L1和L2合并为一个递增的整数序列。

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

Notes: 

1. 总是先malloc 一个Node,初始化一个list,以及add to list。

2. 对List , L = header,  L->next = first data node。

3. List操作,通常需要一个 ListNode  L 记录链表的开始,从而可以访问链表;另一个 pNode 记录链表的尾/位置 进行crud操作。

#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;
}

/* 你的代码将被嵌在这里 */
List Read(){
int numOfNodes;
scanf("%d", &numOfNodes);

List L = (List)malloc(sizeof( Node));
L->Next = NULL;
// L->Data = numOfNodes;	//第0个节点(头指针)直接指向 -> 节点1,真正的数据首节点。

List tail;
tail = L;	//tail指向头节点
for (int i = 0; i < numOfNodes; ++i)
{
int numElem;
scanf("%d", &numElem);
List pNode = (List)malloc(sizeof(Node));
pNode -> Data = numElem;
tail -> Next = pNode;	//连接新生成的pNode到tail上
tail = pNode;			//移动tail一位,即指向pNode
}
tail -> Next = NULL;		//添加数字完毕,尾节点 ->Next 设为空。
return L;
}

void Print(List L){
int length = L->Data;
List pNode = L->Next;	//pNode指向数据首节点
if (pNode == NULL){
printf("NULL\n");
return;
}
while(pNode != NULL){
printf("%d  ", pNode->Data);
pNode = pNode->Next;
}
printf("\n");
}

List Merge(List L1, List L2){
List L = (List)malloc(sizeof(List));
L->Next = NULL;

List p1, p2, pList, pAdd;
p1 = L1->Next;
p2 = L2->Next;
pList = L;
while(p1 && p2){
if(p1->Data < p2-> Data){		//小的先链接
pAdd = p1;
p1 = p1->Next;
}else if(p1->Data > p2->Data){
pAdd = p2;
p2 = p2->Next;
}else {       //相等的时候就先加p1,往后走一步
pAdd = p1;
p1=p1->Next;
}
pList->Next = pAdd;
pList = pList->Next;		//pList后移
}
if(p1){
pList->Next = p1;
}else{
pList->Next = p2;
}
L1->Next = NULL;
L2->Next = NULL;

return L;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: