两个升序链表合并,并要求去掉重复元素 。
分析:
- 如何使链表本身是有序的,这个我们可以在加入元素的过程中做到
- 合并,并去掉重复元素,这个是难点
思路:主要思想类似于直接插入排序和归并排序。
- 指针p指向list1,指针q指向list2,由于list1已经有序,我们只需要把q指向的节点插入一个原本有序的表,这不就是直接插入排序算法吗?当然,得把p移动到合适位置。
- 再由于list2也已经有序,因此插入过程中p不需回溯,只需不断地往后移动,这不就是归并排序吗?如果q指向节点的值域和p指向节点的值域相同,则应该丢掉此节点(去重),q=q->next,就行了。
细节看代码:
#include<iostream>
#include<iomanip>
using namespace std;
class Node //节点类
{
public:
int value;
Node *next;
Node(int value, Node *next=NULL) :value(value), next(next){}; //构造函数
};
class List //链表类
{
private:
Node *head;
public:
List() //构造函数
{
head = new Node(0, NULL); //头节点
}
~List(); //析构函数
void print();
void add(int value);
void merge(List list);
};
void List::add(int value) //添加元素,升序
{
if (head->next == NULL) //如果表中无元素
{
head->next = new Node(value, NULL);
return;
}
Node *p = head;
while (p->next && p->next->value<value)
p = p->next;
if (p->next == NULL) //如果到达表的末尾
{
p->next = new Node(value);
p->next->next = NULL;
}
else
{
Node *node = new Node(value);
node->next = p->next;
p->next = node;
}
}
void List::merge(List list) //合并链表,思路:把list中的节点用类似于直接插入的方法进行插入
{
Node*p = head;
Node*q = list.head->next;
for (; q; q = q->next)
{
while (p->next && p->next->value < q->value) //为q所指向节点的插入,寻找合适的位置
p = p->next;
if (p->next == NULL) //到末尾
{
p->next = new Node(q->value);
p->next->next = NULL; //这一句可以不加
continue;
}
if (q->value == p->next->value) //重复元素不添加
{
continue;
}
Node *node = new Node(q->value);
node->next = p->next;
p->next = node;
}
}
void List::print()
{
for (Node* p = head->next; p; p = p->next)
cout << setw(4) << p->value;
cout << endl;
}
List::~List()
{
Node *q, *p = head;
while (p)
{
q = p->next;
delete p;
p = q;
}
}
int main()
{
// 两个升序链表合并,并要求去掉重复元素
List list1;
list1.add(1);
list1.add(5);
list1.add(2);
list1.add(10);
list1.add(13);
list1.add(6);
cout << "表一" << endl;
list1.print(); //打印表一
List list2;
list2.add(0);
list2.add(5);
list2.add(2);
list2.add(8);
list2.add(19);
list2.add(1);
list2.add(56);
cout << "表二" << endl;
list2.print();
list1.merge(list2);
cout << "合并后" << endl;
list1.print();
system("pause");
return 0;
}
运行:
若是对你有所帮助,或是觉得有意思,希望顶一个哦。
专栏目录: