在PTA上刷DS的題目,有些問題和細(xì)節(jié),放上來和大家分享和討論
兩個有序鏈表序列的合并
本題要求實現(xiàn)一個函數(shù),將兩個鏈表表示的遞增整數(shù)序列合并為一個非遞減的整數(shù)序列。
函數(shù)接口定義:
List Merge( List L1, List L2 );
其中List結(jié)構(gòu)定義如下:
typedef struct Node *PtrToNode;
struct Node {
ElementType Data; /* 存儲結(jié)點數(shù)據(jù) */
PtrToNode Next; /* 指向下一個結(jié)點的指針 */
};
typedef PtrToNode List; /* 定義單鏈表類型 */
L1和L2是給定的帶頭結(jié)點的單鏈表,其結(jié)點存儲的數(shù)據(jù)是遞增有序的;函數(shù)Merge要將L1和L2合并為一個非遞減的整數(shù)序列。應(yīng)直接使用原序列中的結(jié)點,返回歸并后的鏈表頭指針。
裁判測試程序樣例:
#include <stdio.h>
#include <stdlib.h>
typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
ElementType Data;
PtrToNode Next;
};
typedef PtrToNode List;
List Read(); /* 細(xì)節(jié)在此不表 */
void Print( List L ); /* 細(xì)節(jié)在此不表;空鏈表將輸出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
解答
這是一道函數(shù)題,只需要給出核心函數(shù)Merge的代碼,注意L1,L2是帶有頭結(jié)點的鏈表,返回的鏈表好像沒有帶頭結(jié)點。
List Merge(List L1,List L2)
{
List L,ptr,t1,t2;
if (L1 == NULL && L2 == NULL )
return NULL;
else if(L1 == NULL)
return L2;
else if(L2 == NULL)
return L1;
t1 = L1->Next;t2 = L2->Next;
L = (List)malloc(sizeof(struct Node));
L->Next = NULL;
ptr = L;
while(t1&&t2)
{
if(t1->Data <= t2->Data)
{
ptr->Next = t1;
ptr = t1;
t1 = t1->Next;
ptr->Next = NULL;
}
else
{
ptr->Next = t2;
ptr = t2;
t2 = t2->Next;
ptr->Next = NULL;
}
}
while(t1)
{
ptr->Next = t1;
ptr = t1;
t1 = t1->Next;
ptr->Next = NULL;
}
while(t2)
{
ptr->Next = t2;
ptr = t2;
t2 = t2->Next;
ptr->Next = NULL;
}
L1->Next = NULL;L2->Next = NULL;
return L;
}