PAT数据结构_02-线性结构1 两个有序链表序列的合并 (15分)
2016-11-26 20:47
716 查看
问题地址: https://pta.patest.cn/pta/test/1342/exam/3/question/19208
问题:编写函数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操作。
问题:编写函数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; }
相关文章推荐
- 02-线性结构1 两个有序链表序列的合并 (15分)
- 02-线性结构1 两个有序链表序列的合并 (15分)
- 02-线性结构1 两个有序链表序列的合并 (15分)
- 02-线性结构1 两个有序链表序列的合并 (15分)
- 02-线性结构1 两个有序链表序列的合并 (15分)
- 02-线性结构1 两个有序链表序列的合并 (15分)
- 数据结构 02-线性结构1 两个有序链表序列的合并
- 02-线性结构1 两个有序链表序列的合并——中国大学MOOC-陈越、何钦铭-数据结构-2017秋
- [PAT] 02-线性结构1 两个有序链表序列的合并
- 02-线性结构1 两个有序链表序列的合并 (15分)
- 02-线性结构1 两个有序链表序列的合并 (15分)
- 02-线性结构1 两个有序链表序列的合并 (15分)
- [数据结构]02-线性结构1 两个有序链表序列的合并
- 02-线性结构1 两个有序链表序列的合并 (15分)
- 02-线性结构1 两个有序链表序列的合并
- 02-线性结构1 两个有序链表序列的合并
- 02-线性结构1 两个有序链表序列的合并
- 02-线性结构1 两个有序链表序列的合并(15 分)
- 02-线性结构1 两个有序链表序列的合并 4000
- 02-线性结构1 两个有序链表序列的合并