一、题目描述
二、算法步骤
相同后缀题目中指的是:两个链表从第x个节点开始,往后的字母都相同。想找到相同后缀,对于长度相同的链表,可以让pq指针分别指向他俩,然后一起走,走到相同的字母处就是公共后缀的开始。但对于长度不同的链表,需要让长的先走一会,然后一起走,这样保证两个链表是尾部对齐的,此时就很好找公共后缀了。
因此首先计算每个链表的长度n、m,然后谁长谁先走max(n,m)-min(n,m)步,然后一起走,接着判断是否走到了相同元素,如果是,就打印。
int GetLength(LinkList* L)//求链表长度
{
Node* cur = L->next;
int cnt = 0;
while (cur != NULL)
{
cnt++;
cur = cur->next;
}
return cnt;
}
n = GetLength(L);
m = GetLength(L2);
cur = L;
Node* cur2 =L2;
if (n > m)//谁长谁就先走
{
int k = n - m;
cur = L;
for (int i = 0; i < k; i++)
{
cur = cur->next;
}
}
else
{
int k = n - m;
cur2 = L2;
for (int i = 0; i < k; i++) { cur = cur->next; }
}
while (cur || cur2)//然后两者一起走,只要指向的元素相同即可。
{
if (cur->data == cur2->data) { cout << cur->data; }
cur = cur->next;
cur2 = cur2->next;
}
结果展示:
```cpp
7 5
loading
L1为
l->o->a->d->i->n->g
being
L2为
b->e->i->n->g
ing
时间复杂度为O(max(n,m))或者O(n+m);
三、总结
本题较为简单,关键点是使两个链表尾部对齐,然后设置双指针依此查找。
- THE END -
最后修改:2024年2月11日