2301_78694781 2024-04-06 21:47 采纳率: 91.7%
浏览 5
已结题

合并循环链表出现问题


void mergeList(Node *lista, Node *listb, Node *&listc) {
    Node *pa = lista->next;
    Node *pb = listb->next;
    Node *pc = listc = lista;

    while (pa->next != lista && pb->next != listb) {
        if (pa->data <= pb->data) {
            pc->next = pa;
            pc = pa;
            pa = pa->next;
        } else {
            pc->next = pb;
            pc = pb;
            pb = pb->next;
        }
    }

    pc->next = lista; 

  
    if (pa->next != lista) {
        pc->next = pa;
        while (pa->next != lista) {
            pa = pa->next;
        }
        pa->next = listc;
    } else {
        pc->next = pb;
        while (pb->next != listb) {
            pb = pb->next;
        }
        pb->next = listc;
    }

我想写一个合并两个循环链表的函数,但是调试后发现两个链表中的第一个数据都不能被合并,而且如果有两个一样的数据也只会记录一个,与我的预期不符

  • 写回答

4条回答 默认 最新

  • 关注

    循环开始前,pa 和 pb 分别指向 lista 和 listb 的下一个节点。但是循环内部pa 和 pb 在首次循环中就被移动到下一个节点,导致第一个节点的数据丢失。
    pa 或 pb 到达其初始节点时,应该结束循环。代码中 pa->next != lista 和 pb->next != listb导致循环终止条件不正确

    void mergeList(Node *lista, Node *listb, Node *&listc) {
        Node *pa = lista->next;
        Node *pb = listb->next;
        Node *pc = listc = lista;
    
        // 处理第一个节点
        if (pa != lista && pb != listb) {
            if (pa->data <= pb->data) {
                pc->next = pa;
                pc = pa;
                pa = pa->next;
            } else {
                pc->next = pb;
                pc = pb;
                pb = pb->next;
            }
        }
    
        // 合并链表
        while (pa != lista && pb != listb) {
            if (pa->data <= pb->data) {
                pc->next = pa;
                pc = pa;
                pa = pa->next;
            } else {
                pc->next = pb;
                pc = pb;
                pb = pb->next;
            }
        }
    
        // 处理剩余节点
        if (pa != lista) {
            pc->next = pa;
            while (pa->next != lista) {
                pa = pa->next;
            }
            pa->next = listc;
        } else {
            pc->next = pb;
            while (pb->next != listb) {
                pb = pb->next;
            }
            pb->next = listc;
        }
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 4月15日
  • 已采纳回答 4月7日
  • 创建了问题 4月6日