数据结构与算法-6查找两个单词链表共同后缀的起始结点

本文介绍了一种高效算法,用于找出并输出两个由单链表表示的单词的共同后缀起始位置的结点对应的字符。通过调整较长单词的指针,使两个单词的末尾对齐,然后逐个比较字符,直至找到首个不同字符前的相同字符。

Description
假定采用带头结点的单链表保存单词,当两个单词有相同的后缀时,则可共享相同的后缀空间。例如,“loading”和“being”的存储映像如下图所示:
数据结构与算法-6
设str1和str2分别指向两个单词所在单链表的头结点,请实现一个时间上尽可能高效的算法,找出由str1和str2所指的两个链表共同后缀的起始位置的结点,输出该结点对应的字符(如图中的字符i)。

Input
多组数据,每组数据有三行,第一行为链表str1和str2的长度n和m,第二行为链表str1的n个元素,第三行为链表str2的m个元素(元素之间用空格分隔)。n=0且m=0时输入结束。

Output
对于每组数据输出一行,为共同后缀的起始位置结点对应的字符。

Sample Input
7 5
l o a d i n g
b e i n g
7 9
f l u e n c y
f r e q u e n c y
0 0

Sample Output
i
u

参考程序(C语言实现)

#include <stdio.h>
#include <stdlib.h>
#define ROOM sizeof(struct ListNode)
#define LEN 200
struct ListNode
{
   
   
	char letter;
	struct ListNode *next;
};

struct ListNode* CreateList(int n)
{
   
   
	struct ListNode *head,*p1,*p2;
	char word[LEN];
	int i
### 三阶链表共同后缀查找算法 为了找出两个带头结点的单链表表示的单词共同后缀起始位置,可以利用双指针法。该方法通过计算两个链表的长度差异,调整指针的起始位置,使得两个指针在剩余长度相同的情况下同步前进,最终找到共同后缀起始节点[^1]。 ### JavaScript 实现代码 ```javascript function ListNode(val) { this.val = val; this.next = null; } function findCommonSuffix(headA, headB) { if (!headA || !headB) return null; // 计算两个链表的长度 function getLength(head) { let length = 0; let current = head; while (current) { length++; current = current.next; } return length; } let lenA = getLength(headA); let lenB = getLength(headB); // 让较长的链表指针先移动,使得两个链表剩余长度相同 let ptrA = headA; let ptrB = headB; if (lenA > lenB) { let diff = lenA - lenB; while (diff--) { ptrA = ptrA.next; } } else { let diff = lenB - lenA; while (diff--) { ptrB = ptrB.next; } } // 同时移动两个指针,寻找共同后缀起始节点 while (ptrA && ptrB) { if (ptrA === ptrB) { return ptrA; // 找到共同后缀起始节点 } ptrA = ptrA.next; ptrB = ptrB.next; } return null; // 无共同后缀 } ``` ### 算法分析 - **时间复杂度**:O(n),其中 n 是链表的长度。需要遍历两次链表以计算长度,进行一次同步遍历。 - **空间复杂度**:O(1),仅使用了常数级别的额外空间。 ### 算法优势 - **高效性**:通过双指针法避免了额外的存储操作,直接利用链表长度差异进行指针调整。 - **适用性**:适用于处理两个链表共同后缀查找问题,例如判断两个单词是否有相同的后缀部分。 - **稳定性**:由于未涉及链表的修改操作,算法不会改变原始链表的结构。 ###
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值