-
题目描述
-
解题思路心得
代码写得最丑的一集……
a一个指针,b一个指针,如果相等就保留a;如果不等且a较大循环b,a较小直接删除这个节点。
删除节点时用一个指针保留前一个节点。
棘手的是循环条件,都写到注释里了,不过感觉有更好的方法?凑合看吧。
谁学到了我学到了谁傻了我傻了我一开始在想什么啊啊
a一个指针,b一个指针。一样的要他,不一样的小的那个往后变大找一样的,没了退出循环。
-
代码
更新最正常的人的代码
void interseclist(LNode *&LA, LNode *&LB)
{
LNode *pa = LA->next;
LNode *pb = LB->next;
LNode *pr = LA;
LA->next=NULL;
while (pa && pb)
{
if (pa->data<pb->data)
{
pa=pa->next;
}
else if (pa->data>pb->data)
{
pb=pb->next;
}
else
{
pr->next=pa;
pr=pr->next;
pa=pa->next;
pb=pb->next;
}
}
pr->next=NULL;
}
比较丑的代码
#include <iostream>
using namespace std;
struct LNode
{
int data;
LNode *next;
};
void createlist(LNode *&L, int length)
{
LNode *p = L;
for (int i = 0; i < length; i++)
{
LNode *tmp = new LNode;
cin >> tmp->data;
tmp->next = NULL;
p->next = tmp;
p = p->next;
}
}
int Printlist(LNode *L)
{
LNode *p = L->next;
if (p == NULL)
return 0;
while (p)
{
cout << p->data;
if (p->next != NULL)
{
cout << " ";
}
p = p->next;
}
cout << endl;
return 0;
}
void interseclist(LNode *&LA, LNode *&LB)
{
LNode *pa = LA->next;
LNode *pb = LB->next;
LNode *pr = LA;
while (pa != NULL)
{
// 相等太好了是交集呢就要保留a
// a,b下一个,r也要下一个
if (pa->data == pb->data)
{
// 如果b是最后一个不用再比了,保留这个a,删掉剩余的a
// 例如
/* code
3 6 7 9
1 2 6*/
if (pb->next == NULL)
{
pa->next = NULL;
break;
}
pa = pa->next;
pr = pr->next;
pb = pb->next;
}
// 如果a小说明这个a不是一样的再下一个b更大也没有一样的不用比了
else if (pa->data < pb->data)
{
// 删除删除
pr->next = pa->next;
free(pa);
pa = pr->next;
}
// 如果a大那就看看下一个b吧可能会有一样的
else
{
// b是最后一个没下一个了不用比了这个a也不一样删掉
if (pb->next == NULL)
{
pr->next = NULL;
free(pa);
break;
}
pb = pb->next;
}
}
}
int main()
{
int anum = 0, bnum = 0;
while (1)
{
LNode *a = new LNode;
LNode *b = new LNode;
LNode *c;
a->next = NULL;
b->next = NULL;
cin >> anum >> bnum;
if (anum == 0 || bnum == 0)
{
break;
}
createlist(a, anum);
createlist(b, bnum);
interseclist(a, b);
Printlist(a);
}
return 0;
}
最原始的丑丑废案
// 我也不知道写了什么但是删除节点用的是copy后一个数值所以考虑了很多p->next=null指针的情况,
// 感觉用链表长度判断一下?其实应该再来个指针吧,但是懒得改了
void interseclist(LNode *&LA, LNode *&LB)
{
LNode *pa = LA->next;
LNode *pb = LB->next;
LNode *r;
// 以前写的更蠢的代码什么好人会这么写啊
while (pa != NULL)
{
// 相等太好了是交集呢就要保留a,b也要下一个
if (pa->data == pb->data)
{
// 如果b是最后一个不用再比了,剩余的a也要删掉
// 例如
/* code
3 6 7 9
1 2 6*/
if (pb->next == NULL)
{
pa->next = NULL;
break;
}
// 如果b是倒数第二个且a有下一个且和b的下一个不一样当然也不用再比了
/* code
3 7 8
1 2 3 4*/
if (pb->next->next == NULL && pa->next != NULL)
{
if (pa->next->data != pb->next->data)
{
pa->next = NULL;
break;
}
}
pa = pa->next;
pb = pb->next;
}
// 如果a小说明这个a不是一样的再下一个b也没有一样的不用比了
else if (pa->data < pb->data)
{
// a是最后一个不用比了
/* code
1 2 3
2 8 9*/
if (pa->next == NULL)
{
pa->next = NULL;
break;
}
// 删除删除
pa->data = pa->next->data;
r = pa->next;
pa->next = r->next;
free(r);
}
// 如果a大那就看看下一个b吧可能会有一样的
else
{
pb = pb->next;
}
}
}