求两个有序链表序列的交集 运行超时怎么办
本帖最后由 whzyb1991 于 2014-07-24 22:19:55 编辑
已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3。
输入格式说明:
输入分2行,分别在每行给出由若干个正整数构成的非降序序列,用-1表示序列的结尾(-1不属于这个序列)。数字用空格间隔。
输出格式说明:
在一行中输出两个输入序列的交集序列,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出“NULL”。
样例输入与输出:
序号输入输出
(1)
1 2 5 -1
2 4 5 8 10 -1
2 5
(2)
1 3 5 -1
2 4 6 8 10 -1
NULL
(3)
1 2 3 4 5 -1
1 2 3 4 5 -1
1 2 3 4 5
(4)
3 5 7 -1
2 3 4 5 6 7 8 -1
3 5 7
(5)
-1
10 100 1000 -1
NULL
我的代码是
#include
#include
#define LEN sizeof(struct node)
typedef struct node{
int s;
struct node* next;
}Node;
Node* create()
{
Node *p1,*p2,*pHead;
pHead = NULL;
p1 = p2 = (Node *)malloc(LEN);
scanf("%d",&(p1->s));
while((p1->s)!=-1){
if(pHead == NULL)
pHead = p1;
else
p2->next = p1;
p2 = p1;
p1 = (Node *)malloc(LEN);
scanf("%d",&(p1->s));
}
p1->next = NULL;
if(pHead==NULL)
return p1;
else
return pHead;
}
//Do not need to save the intersection into a new pointer
void find_inter(Node *pHead1, Node *pHead2)
{
int a=0;
if(pHead1->next == NULL|pHead2->next == NULL){
printf("NULL");
return;
}
for(Node *p1 = pHead1; p1!= NULL; p1 = p1->next)
for(Node *p2 = pHead2; p2!= NULL; p2 = p2->next)
if(p1->s == p2->s)
{
if(a==0)
printf("%d",p1->s);
else
printf(" %d",p1->s);
++a;}
if(!a)
printf("NULL");
}
int main()
{
Node *p1,*p2;
p1=create();
p2=create();
find_inter(p1,p2);
}
提交上去后最后一个测试点说运行超时。的确,我的思路很简单,复杂度变成了O(N^2)
我知道用c++怎么能提交成功,但是希望可以用纯c的链表来处理,求指导
------解决方案--------------------
你这个思路完全忽视了“有序”这个重要的条件。
我这个O(n+m),我没测试,目测应该可以。
void find_inter(Node *pHead1, Node *pHead2)
{
int found = 0;
while (pHead1 != NULL && pHead2 != NULL) {
if (pHead1->s s) {
pHead1 = pHead1->next;
} else if (pHead1->s > pHead2->s) {
pHead2 = pHead2->next;
} else {
found = 1;
printf("%d ", pHead1->s);
pHead1 = pHead1->next;
pHead2 = pHead2->next;
}
}
if (!found) {
printf("NULL");
}
printf("\n");
}