可以使用双指针法实现。首先,将两个链表的头节点分别赋值给两个指针pA和pB。然后,循环比较pA和pB所指向的节点的值大小,若pA所指节点的值小于pB所指节点的值,则移动pA指针指向下一个节点;若pA所指节点的值大于pB所指节点的值,则移动pB指针指向下一个节点;若pA所指节点的值等于pB所指节点的值,则删除pA所指节点,并移动pA指针指向下一个节点。直到pA或pB指向NULL为止。
具体步骤如下:
- 定义两个指针pA和pB,分别指向链表A和B的头节点。
- 定义一个指针prevA,用于记录当前节点的前一个节点,初始值为NULL。
- 循环遍历链表A,直到pA为空为止:
- 判断pA所指节点的值是否等于pB所指节点的值:
- 若相等,则删除pA所指节点,即将prevA的next指针指向pA的next指针所指节点,并释放pA所指节点的内存空间;
- 若不相等,则将prevA指针指向pA所指节点,并将pA指针指向下一个节点。
- 判断pA所指节点的值是否大于pB所指节点的值:
- 若大于,则将pB指针指向下一个节点;
- 若小于,则继续比较下一个节点。
- 判断pA所指节点的值是否等于pB所指节点的值:
- 返回链表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的头节点。
请注意,这只是一个简单的示例,实际应用中可能需要根据具体情况进行修改和完善。