合并两个有序单链表并删除重复值
时间: 2024-11-06 17:17:15 浏览: 15
实验一_有序单链表合并_
5星 · 资源好评率100%
为了合并两个有序单链表并删除重复值,我们可以先创建一个新的空链表作为结果链表`list3`。下面是合并过程的一个示例,假设我们已经定义了链表节点结构`ListNode`:
```cpp
// 假设 ListNode 类似于:struct ListNode {
// int val;
// ListNode* next;
// ListNode(int x): val(x), next(nullptr) {}
//}
ListNode* mergeAndRemoveDuplicates(ListNode* head1, ListNode* head2) {
ListNode dummy(0); // 创建一个虚拟头节点,用于简化合并操作
ListNode* tail3 = &dummy; // 初始化结果链表的尾部
while (head1 && head2) { // 同时遍历两个链表
if (head1->val < head2->val) {
tail3->next = head1;
head1 = head1->next;
} else if (head1->val > head2->val) {
tail3->next = head2;
head2 = head2->next;
} else { // 如果值相同,仅保留第一个出现的
if (head1 == head2) { // 避免添加重复的 head1 节点
head1 = head1->next;
} else {
tail3->next = head1;
head1 = head1->next;
}
}
tail3 = tail3->next; // 更新尾部指针
}
// 添加剩余链表(如果有)
if (head1) {
tail3->next = head1;
} else {
tail3->next = head2;
}
return dummy.next; // 返回新链表的头节点
}
```
上述代码首先比较两个链表当前节点的值,选择较小的那个添加到结果链表中,并移动对应链表的指针。当其中一个链表遍历完,直接将另一个链表剩余部分添加到结果链表。这样可以确保结果链表是有序的并且删除了重复的值。
阅读全文