[刷题] PTA 02-线性结构1 两个有序链表序列的合并
程序:
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 typedef int ElementType; 5 typedef struct Node *PtrToNode; 6 struct Node { 7 ElementType Data; 8 PtrToNode Next; 9 }; 10 typedef PtrToNode List; 11 12 List Read(); /* 细节在此不表 */ 13 void Print( List L ); /* 细节在此不表;空链表将输出NULL */ 14 15 List Merge( List L1, List L2 ); 16 17 int main() 18 { 19 List L1, L2, L; 20 L1 = Read(); 21 L2 = Read(); 22 L = Merge(L1, L2); 23 Print(L); 24 Print(L1); 25 Print(L2); 26 return 0; 27 } 28 29 List Merge(List L1,List L2) { 30 List L3=(List)malloc(sizeof(struct Node)); 31 List L = L3; 32 List p1=L1->Next; 33 List p2=L2->Next; 34 while(p1&&p2) { 35 if(p1->Data<p2->Data) { 36 L->Next = p1; 37 p1=p1->Next; 38 } else { 39 L->Next = p2; 40 p2=p2->Next; 41 } 42 L=L->Next; 43 } 44 L->Next = NULL; 45 if(p1) L->Next=p1; 46 if(p2) L->Next=p2; 47 L1->Next=NULL; 48 L2->Next=NULL; 49 return L3; 50 }
分析:
1、带头结点的单链表,头结点没有数据
2、链表没有整体概念,只有结点
3、利用现有序列中的结点,定义一个新的头结点后,重新定义结点间的连接关系即可。malloc()只使用一次
4、头结点是遍历链表所必须的,定义后不可更改
5、只要p1、p2一个结束了,就把L整体接到没结束的那个链表上,同时原链表指向空