文章

103

粉丝

0

获赞

0

访问

3.6k

头像
2012年计算机学科专业基础综合试题 - 第42题回答
数据结构
发布于2025年6月25日 18:24
阅读数 40

(1)

  • 先遍历两个链表,得到它们的长度。
  • 让较长链表的指针先向后移动差值的长度,然后两个链表指针同时向后移动,逐字符比较,直到字符不同,或到达链尾。
  • 最后,指向相同字符的节点即为共同后缀的起始节点。

 (2)

struct ListNode {
    char data;
    ListNode* next;
};

/**
 * @brief 找出两个单链表共同后缀的起始位置
 * @param str1 指向第一个链表的头节点(带头结点)
 * @param str2 指向第二个链表的头节点(带头结点)
 * @return 指向共同后缀起点的节点,如果无共同后缀返回nullptr
 */
ListNode* findSharedSuffix(ListNode* str1, ListNode* str2) {
    // 1. 计算两个链表的长度(不含头结点)
    int len1 = 0, len2 = 0;
    ListNode* p1 = str1->next;
    ListNode* p2 = str2->next;
    while (p1) {
        len1++;
        p1 = p1->next;
    }
    while (p2) {
        len2++;
        p2 = p2->next;
    }

    // 2. 重新指向链表的起始点
    p1 = str1->next;
    p2 = str2->next;

    // 3. 长链表先向后移动差值
    if (len1 > len2) {
        int diff = len1 - len2;
        for (int i = 0; i < diff; ++i)
            p1 = p1->next;
    } else {
        int diff = len2 - len1;
        for (int i = 0; i < diff; ++i)
         ...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发