链表常见操作:有序链表合并去重

来源:互联网 发布:名片设计排版软件 编辑:程序博客网 时间:2024/06/05 03:01

两个升序链表合并,并要求去掉重复元素 。

分析:

  1. 如何使链表本身是有序的,这个我们可以在加入元素的过程中做到
  2. 合并,并去掉重复元素,这个是难点
思路:主要思想类似于直接插入排序归并排序
  1. 指针p指向list1,指针q指向list2,由于list1已经有序,我们只需要把q指向的节点插入一个原本有序的表,这不就是直接插入排序算法吗?当然,得把p移动到合适位置。
  2. 再由于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;}

运行:


思考:这里要求去重,我们可以写一个简单点的:不去重的,但要求保持有序,大家可以试试。可以写在评论里哦,我的的写在一楼,欢迎不吝赐教,thanks。


转载请注明出处,本文地址:http://blog.csdn.net/zhangxiangdavaid/article/details/26340587

若是对你有所帮助,或是觉得有意思,希望顶一个哦。

专栏目录:
  • 数据结构与算法目录
  • c指针




4 0