已知两个用单链表表示的有序表A和B,设计一算法删除A中所有与B相同的记录

可以使用双指针法实现。首先,将两个链表的头节点分别赋值给两个指针pA和pB。然后,循环比较pA和pB所指向的节点的值大小,若pA所指节点的值小于pB所指节点的值,则移动pA指针指向下一个节点;若pA所指节点的值大于pB所指节点的值,则移动pB指针指向下一个节点;若pA所指节点的值等于pB所指节点的值,则删除pA所指节点,并移动pA指针指向下一个节点。直到pA或pB指向NULL为止。

具体步骤如下:

  1. 定义两个指针pA和pB,分别指向链表A和B的头节点。
  2. 定义一个指针prevA,用于记录当前节点的前一个节点,初始值为NULL。
  3. 循环遍历链表A,直到pA为空为止:
    1. 判断pA所指节点的值是否等于pB所指节点的值:
      • 若相等,则删除pA所指节点,即将prevA的next指针指向pA的next指针所指节点,并释放pA所指节点的内存空间;
      • 若不相等,则将prevA指针指向pA所指节点,并将pA指针指向下一个节点。
    2. 判断pA所指节点的值是否大于pB所指节点的值:
      • 若大于,则将pB指针指向下一个节点;
      • 若小于,则继续比较下一个节点。
  4. 返回链表A的头节点。

时间复杂度为O(m+n),其中m和n分别为链表A和B的长度。

#include <stdio.h>
#include <stdlib.h>

struct ListNode {
    int val;
    struct ListNode *next;
};

struct ListNode* deleteNodes(struct ListNode* headA, struct ListNode* headB) {
    struct ListNode dummy;  // 创建一个虚拟头节点简化操作
    dummy.next = headA;
    struct ListNode *prevA = &dummy;
    struct ListNode *pA = headA;
    struct ListNode *pB = headB;

    while (pA != NULL && pB != NULL) {
        if (pA->val < pB->val) {
            prevA = pA;
            pA = pA->next;
        } else if (pA->val > pB->val) {
            pB = pB->next;
        } else {  // pA->val == pB->val
            prevA->next = pA->next;
            free(pA);
            pA = prevA->next;
        }
    }

    return dummy.next;  // 返回删除节点后的链表头节点
}

在这个示例中,我们假设链表节点的结构体为struct ListNode,其中包含一个整型的值val和指向下一个节点的指针next。函数deleteNodes接受两个参数,分别是链表A和链表B的头节点。在函数内部,我们使用双指针来遍历链表A和B,并根据节点值的大小进行删除操作。最后返回删除节点后的链表A的头节点。

请注意,这只是一个简单的示例,实际应用中可能需要根据具体情况进行修改和完善。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值