本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个非递减的整数序列。
List Merge( List L1, List L2 );
其中List结构定义如下:
typedef struct Node PtrToNode;
struct Node {
ElementType Data; / 存储结点数据 /
PtrToNode Next; / 指向下一个结点的指针 /
};
typedef PtrToNode List; / 定义单链表类型 */
L1和L2是给定的带头结点的单链表,其结点存储的数据是递增有序的;函数Merge要将L1和L2合并为一个非递减的整数序列。应直接使用原序列中的结点,返回归并后的带头结点的链表头指针。
#include
#include
typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
ElementType Data;
PtrToNode Next;
};
typedef PtrToNode List;
List Read(); /* 细节在此不表 /
void Print( List L ); / 细节在此不表;空链表将输出NULL */
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;
}
/* 你的代码将被嵌在这里 */
3
1 3 5
5
2 4 6 8 10
1 2 3 4 5 6 8 10
NULL
NULL
#include
#include
typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
ElementType Data;
PtrToNode Next;
};
typedef PtrToNode List;
List Read(); /* 细节在此表 */
void Print( List L ); /* 细节在此不表;空链表将输出NULL */
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;
}
List Read(){
int num;
scanf("%d", &num);
List L = (List)malloc(sizeof( Node));
L->Next = NULL;
List tail;
tail = L;
for (int i = 0; i < num; ++i)
{
int data;
scanf("%d", &data);
List pNode = (List)malloc(sizeof(Node));
pNode -> Data = data;
tail -> Next = pNode;
tail = pNode;
}
tail -> Next = NULL;
return L;
}
void Print(List L){
List pNode = L->Next;
if (pNode == NULL){
printf("NULL\n");
return;
}
while(pNode != NULL){
printf("%d ", pNode->Data);
pNode = pNode->Next;
}
printf("\n");
}
List Merge( List L1, List L2 )
{
List L3=(List)malloc(sizeof(Node));
List L=L3;
List p=L1->Next;
List q=L2->Next;
while(p&&q)
{
if(p->DataData)
{
L->Next=p;
p=p->Next;
}
else
{
L->Next=q;
q=q->Next;
}
L=L->Next;
}
L->Next=p ? p : q;
L1->Next=NULL;
L2->Next=NULL;
return L3;
}
给定一条单链表,将链表结点进行头尾交错重新排序,即如果一条单链表为 L1 -> L2 -> … -> L(n-1) -> Ln ,那么重新排序完的结果是 L1 -> Ln -> L2 -> L(n-1) -> L3 -> L(n-2) -> …
每个输入文件中一组数据。
第一行给出结点的总个数N(0 其中Address为结点地址(不足5位的高位用零填充至5位),Data为结点的数据域(绝对值不超过10^5的整数),Next为结点的指针域(即下一个结点的地址)。数据保证Address不等于-1。 输出按题目要求重新排序后的单链表。第一行为重新排序后单链表上结点的个数、第一个结点的地址。 之后每行一个结点,输出格式与输入相同,结点输出顺序为单链表连接顺序。 5 11111Address Data Next
Output
Sample Input
33333 0 44444
22222 2 33333
11111 5 22222
05689 8 -1
44444 6 05689
Sample Output
5 11111
11111 5 05689
05689 8 22222
22222 2 44444
44444 6 33333
33333 0 -1Address: https://logn.me/problem/1042
Note1
Code1
#include
Note2
Code2
#include