[刷题] 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整体接到没结束的那个链表上,同时原链表指向空

原文地址:https://www.cnblogs.com/cxc1357/p/10808103.html