链表常见操作:有序链表合并去重
来源:互联网 发布:名片设计排版软件 编辑:程序博客网 时间:2024/06/05 03:01
两个升序链表合并,并要求去掉重复元素 。
分析:
- 如何使链表本身是有序的,这个我们可以在加入元素的过程中做到
- 合并,并去掉重复元素,这个是难点
思路:主要思想类似于直接插入排序和归并排序。
- 指针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;}
运行:
转载请注明出处,本文地址:http://blog.csdn.net/zhangxiangdavaid/article/details/26340587
若是对你有所帮助,或是觉得有意思,希望顶一个哦。
专栏目录:
- 数据结构与算法目录
- c指针
4 0
- 链表常见操作:有序链表合并去重
- 算法:有序链表的去重
- 有序链表合并&有序数组合并
- 有序链表的合并操作
- 有序链表合并
- 合并有序链表
- 合并有序链表
- 合并有序链表
- 合并有序链表
- 有序链表合并
- 合并有序链表
- 合并有序链表
- 合并有序链表
- 有序链表合并
- 有序链表合并
- 合并有序链表
- 合并有序链表
- 合并有序链表
- Nim游戏博弈(收集完全版)
- Eclipse 报 "The builder launch configuration could not be found" 错误的解决办法
- 组合数学
- 又是郁闷的 一天
- Linux的启动流程
- 链表常见操作:有序链表合并去重
- python学习之python中使用tab自动补齐
- 雨巷 戴望舒
- 渐行渐远的老朋友们,谢谢你们曾经陪我走过
- 【LeetCode】word ladder I&& II
- Python script listening
- Eclipse配置GitHub代码库(以Windows7为例)
- Winsocket 二:多线程阻塞服务器程序(tcp)
- poj 3261 Milk Patterns(后缀数组)