已知两个非降序链表序列S1与S2,设计函数构造出S1与S2合并后的新的非降序链表S3。
输入格式:
输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。
输出格式:
在一行中输出合并后新的非降序链表,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL
。
输入样例:
1 3 5 -1
2 4 6 8 10 -1
输出样例:
1 2 3 4 5 6 8 10
示例代码:
#include <stdio.h>
#include <stdlib.h>
/* 我觉得规范写代码还是很重要的,最好是既规范,又有备注 */
typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
ElementType Data;
PtrToNode Next;
};
typedef PtrToNode List;
void Print( List L );
List Read();
List Merge( List L1, List L2 );
int main()
{
List L1, L2, L;
L1 = Read();
L2 = Read();
L = Merge(L1, L2);
Print(L);
return 0;
}
List Read()
{
int n = 0;
List temp,P;
P = (List)malloc(sizeof(struct Node));
P->Next = NULL;
List L = P;//L是用来操作的参数,P是不动的最后要返回,L俗称工具参
while(1){
scanf("%d",&n);
if(n < 0) break;
temp = (List)malloc(sizeof(struct Node));
temp->Next = NULL;
temp->Data = n;
L->Next = temp;
L = L->Next;
}
return P;
}
//注意我写的都是带头结点的
void Print( List L )
{
if(L->Next == NULL){
printf("NULL");
return;
}
int flag = 0;//flag解决开头不用加空格的问题
while(L->Next != NULL){
if(!flag){
printf("%d",L->Next->Data);
flag = 1;
}else{
printf(" %d",L->Next->Data);
}
L = L->Next;
}
}
//思路是建立新链表,然后比较L1和L2的头,谁小就插入这个新的链表里,时间复杂度O(n)
List Merge( List L1, List L2 )
{
List a = L1->Next,b = L2->Next,P,L;
L = (List)malloc(sizeof(struct Node));
P = L;//这里P是工具参
while(a && b){
if(a->Data < b->Data){
P->Next = a;
P = a;
a = a->Next;
}else{
P->Next = b;
P = b;
b = b->Next;
}
}
//这里是链表,不用一个一个插入,哪边空了直接next指向另一边即可
P->Next=a?a:b;//这里不理解可以自己扣手指模拟一下
return L;
}