本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个非递减的整数序列
函数接口定义:
1
| List Merge( List L1, List L2 );
|
其中List结构定义如下:
1 2 3 4 5 6
| typedef struct Node *PtrToNode; struct Node { ElementType Data; PtrToNode Next; }; typedef PtrToNode List;
|
L1和L2是给定的带头结点的单链表,其结点存储的数据是递增有序的;函数Merge要将L1和L2合并为一个非递减的整数序列。应直接使用原序列中的结点,返回归并后的带头结点的链表头指针。
裁判测试程序样例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| #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 );
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; }
|
输入样例:
输出样例:
1 2 3
| 1 2 3 4 5 6 8 10 NULL NULL
|
编码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| #include <stdio.h> #include <stdlib.h>
typedef int ElementType; typedef struct LNode *PtrToLNode; typedef PtrToLNode List; struct LNode{ ElementType Data; PtrToLNode Next; };
List Merge(List L1, List L2){ List list; list = (List)malloc(sizeof(struct LNode)); list->Next = NULL; if (L1 == NULL && L2 == NULL) { return list; } PtrToLNode Temp1, Temp2, Position; Temp1 = L1->Next; Temp2 = L2->Next; Position = list; L1->Next = NULL; L2->Next = NULL; while(Temp1 && Temp2){ int result = Temp1->Data - Temp2->Data; if (result <=0){ Position->Next = Temp1; Position = Temp1; Temp1 = Temp1->Next; } else{ Position->Next = Temp2; Position = Temp2; Temp2 = Temp2->Next; } } for(;Temp1;Temp1=Temp1->Next){ Position->Next = Temp1; Position = Temp1; } for(;Temp2;Temp2=Temp2->Next) { Position->Next = Temp2; Position = Temp2; } return list; }
|
小结
- 构造空链表list
- 遍历两个链表直至有空结点
- 循环比较两个链表中的结点的大小,将较小结点插入新链表
- 遍历链表List1或List2剩下的结点