两个有序链表序列的合并
已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的并集新非降序链表S3。
输入格式:
输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−表示序列的结尾(−不属于这个序列)。数字用空格间隔。
输出格式:
在一行中输出合并后新的非降序链表,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL
。
输入样例:
1 3 5 -1
2 4 6 8 10 -1
输出样例:
1 2 3 4 5 6 8 10
此题中有一个测试点为大规模数据,因此需要考虑程序所要程序的复杂度。
首先应该注意到题目中的非降序,表示k1, k2, k3……这个序列中k(n-1) <= k(n),不代表就是升序。
比较简单的方法是逐个结点比较,数值较小的结点连接到第三个链表上。
while( p1 || p2){
Ptr p = (Ptr)malloc(sizeof(struct node));
p->next = NULL;
if( p1 == NULL || p1->data > p2->data){ //p1为空,或者p1数值大于p2时,存入p2的值
p->data = p2->data;
p2 = p2->next;
temp->next = p;
temp = p;
}else{
p->data = p1->data;
a = a -> Next;
temp->next = p;
temp = p;
}
}
已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3。
输入格式:
输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−表示序列的结尾(−不属于这个序列)。数字用空格间隔。
输出格式:
在一行中输出两个输入序列的交集序列,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL
。
输入样例:
1 2 5 -1
2 4 5 8 10 -1
输出样例:
2 5
与上题类似,也是需要逐个节点比较,代码如下:
while( p1 && p2){
if( p1->data > p2->data) p2 = p2->next;
else if( p2->data > p1->data) p1 = p1->next;
else{
Ptr p = (Ptr)malloc(sizeof(struct node));
p->next = NULL;
p->data = p1->data;
temp->next = p;
temp = p;
p1 = p1->next;
p2 = p2->next;
}
}
第二题可以看作是两个人爬梯子,数值为高度,要两个人到相同的高度,需要让每一个人都往上爬,当一个人落后时,要让他多往上爬,二人会在高度相等的点作一个标记,存到第三个链表中,因此,只需要双方各爬一遍,即可得到所有高度相同的点。
第一题也可做类似比较。