问题描述:单词每个字母用链表存储,找出两个单词的相同最长后缀,入loading和being
解决思路:分别计算两个单词的长度m和n,然后让长的单词先后移动m-n位后在一一比较
代码如下:
package mango.list;
import mango.list.P038Test21.Node;
/**
* 课后练习22题
* @since 2016/10/21
* @author mango
* @descripe 单词每个字母用链表存储,找出两个单词的相同最长后缀,入loading和being
*/
public class P038Test22 {
public static void main(String[] args) {
//构造单词
Node word1 = new Node();
Node word2 = new Node();
word2.date = "a";
word1.link = word2;
Node word3 = new Node();
word3.link = word2;
System.out.println(solve(word1,word3));
}
/**
* 算法核心代码
* @param str1
* @param str2
* @return
*
* 分别计算两个单词的长度m和n,然后让长的单词先后移动m-n位后在一一比较
*/
public static String solve(Node str1,Node str2){
int str1len = 0;
int str2len = 0;
Node temp1 = str1;
Node temp2 = str2;
//计算str1的长度
while(temp1!=null){
temp1 = temp1.link;
str1len++;
}
//计算str2的长度
while(temp2!=null){
temp2 = temp2.link;
str2len++;
}
int longerMove = str1len-str2len>0 ? str1len-str2len:str2len-str1len;
//将较长的单词先指针后移
if(str1len>str2len){
while(longerMove>0){
str1 = str1.link;
longerMove--;
}
}else{
while(longerMove>0){
str2 = str2.link;
longerMove--;
}
}
str1 = str1.link;
str2 = str2.link;
//比较
while(str1.date!=null && !str1.date.equals(str2.date)){
str1 = str1.link;
str2 = str2.link;
}
return str1.date;
}
//结点的定义
public static class Node{
String date;
Node link;
}
}