两个有序链表的合并与交集

两个有序链表序列的合并

已知两个非降序链表序列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;
		}
	}


要注意题目中的非降序,是按照一定的顺序排列的,在这两道题目中可借助这一条件只将各点遍历一遍即可。 


第二题可以看作是两个人爬梯子,数值为高度,要两个人到相同的高度,需要让每一个人都往上爬,当一个人落后时,要让他多往上爬,二人会在高度相等的点作一个标记,存到第三个链表中,因此,只需要双方各爬一遍,即可得到所有高度相同的点。


第一题也可做类似比较。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值