Day43:链表共同后缀

149 阅读2分钟

day43-链表共同后缀

【2012统考真题】

假定采用带头结点的单链表保存单词,当两个单词有相同的后缀时,可共享相 同的后缀存储空间,例如,“loading"和“being"的存储映像如下图所示。

image.png

设str1和str2分别指向两个单词所在单链表的头结点,链表结点结构为data next,请设计一个时间上尽可能高效的算法,找出由str1和str2所指向两个链表共同后缀的起始位置(如图中字符i所在结点的位置p)。

要求:

1)给出算法的基本设计思想。

2)根据设计思想,采用C或C++或Java语言描述算法,关键之处给出注释。

3)说明你所设计算法的时间复杂度。

1、思路

注明:返回的是倒数第几个节点,而非正数,因为每个单词长度不同,正数可能根据不同的标准,返回不同,但是返回倒数第几个节点的值都相同

1.利用字符串的拼接,来接受链表的data

2.然后反转字符串

3.对字符串遍历

static int f(ListNode node1, ListNode node2){
//声明两个变量作为字符串的下标
    int i = 0, j = 0;
    String temp1 = "";
    String temp2 = "";
 //拼接字符串   
    while (node1 != null || node2 != null){
        if (node1 != null) {
            temp1 += node1.data;
            node1 = node1.next;
        }
        if (node2 != null){
            temp2 += node2.data;
            node2 = node2.next;
        }
    }
 //对字符串进行反转,也可以用递归等方法实现反转功能   
    StringBuffer sb1 = new StringBuffer(temp1);
    temp1 = sb1.reverse().toString();
    StringBuffer sb2 = new StringBuffer(temp2);
    temp2 = sb2.reverse().toString();
//对字符串进行遍历,因为i会自增,所以返回的是i-1;    
    while (i != temp1.length() || j != temp2.length()){
        if (temp1.charAt(i++) != temp2.charAt(j++)){
            return i-1;
        }
    }
//若没有检测到不同,则说明全相同,直接返回字符串的长度即可    
    return temp1.length();
}

拼接完后字符串:

image.png 时间复杂度:由reverse()函数决定,其余为O(n);

空间复杂度:O(n);