02-线性结构 1 两个有序链表序列的合并(函数题)
题目要求
本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个非递减的整数序列。
函数接口定义:
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
| List Merge( List L1, List L2 ) { List L = (List)malloc(sizeof(struct Node)); List tempL1 = L1->Next, tempL2 = L2->Next; List head = L; while(tempL1 && tempL2) { if(tempL1->Data <= tempL2->Data) { L->Next = tempL1; tempL1 = tempL1->Next; L = L->Next; } else { L->Next = tempL2; tempL2 = tempL2->Next; L = L->Next; } } L->Next = tempL1 ? tempL1 : tempL2; L1->Next = NULL; L2->Next = NULL; return head; }
|
解题思路
合并链表的操作重点就是将较小链表节点(此处记为 tempL)插入到合并链表之后:
1 2 3
| 1. L->Next = tempL; 2. tempL = tempL->Next; 3. L = L->Next;
|
直到一个链表遍历完,此时将另一链表剩余部分全部接到合并链表尾:
1
| L->Next = tempL1 ? tempL1 : tempL2;
|
在题目的输出样例中,L1 和 L2 打印均为 NULL,因此,在函数最后将 L1->Next 和 L2->Next 全部置为 NULL。