探讨:将两个链表非降序合并为一个链表并依然有序的实现方法

已知两个链表list1和list,2,各自非降序排列,将它们合并成另外一个链表list3,并且依然有序,要求保留所有节点。
实现过程中,list1中的节点和list2中的节点都转移到了list3中,注意泛型的友元函数的用法。
程序如有不足之处,还望指正!!!
定义List类


代码如下:

#include "stdafx.h"
#include <iostream>

using namespace std;
template<class T>
struct Node
{
 T data;
 Node<T> * next;
};
template <class T>
class MyList
{
public:
 //构造函数,初始化一个头结点,data为空,next指向第一个节点
 MyList()
 {
  phead = new Node<T>;
  phead->data = NULL;
  phead->next = NULL;
 }
 //析构函数,将整个链表删除,这里采用的是正序撤销
 ~MyList()
 {
  Node<T>* p;
  p = phead;
  while (p)
  {
   Node<T>* q;
   q = p;
   p = p->next;
   delete q;
  }
 }
 //复制构造函数
 MyList(MyList& mylist)
 {
  Node<T>* q = mylist.phead->next;
  Node<T>* pb = new Node<T>;
  this->phead = pb;
  while (q != NULL)
  {
   Node<T>* p = new Node<T>;
   p->data = q->data;
   p->next = NULL;
   pb->next = p;
   pb = p;
   q = q->next;
  }
 }
 //插入一个元素的方法,在第i个元素插入一个元素e,
 //返回值为NOTE<T>型指针,指向插入的那个元素
 Node<T>* Insert(int i, T e)
 {
  //在链表的第i个位置,插入一个元素e
  int j = 0;
  Node<T>* p;
  p = phead;
  while (p && j < i - 1)
  {
   p = p->next;
   ++j;
  }
  if (!p || j > i -1)
  {
   return phead;
  }
  Node<T>* q;
  q = new Node<T>;
  q->data = e;
  q->next = p->next;
  p->next = q;
  return q;
 }
 //输出list中的元素
 void Show()
 {
  Node<T> *p = phead->next;
  while (NULL != p)
  {
   cout << p->data << " ";
   p = p->next;
  }
 }
  template<class T> friend void MergeList(MyList<T> &list1, MyList<T> &list2, MyList<T> &list3);
private:
 Node<T>* phead;};

代码如下:

<PRE class=cpp name="code">// </PRE><PRE class=cpp name="code">//将两个链表合并成一个链表,并且依然有序。方法保留了合并之前list1和list2的节点,
//合并之后list1和list2消失。将list1和list2合并为list3
template<class T>
void MergeList(MyList<T> &list1, MyList<T> &list2, MyList<T> &list3)
{
 Node<T> *head1 = list1.phead, *head2 = list2.phead;
 Node<T> *head3 = list3.phead, *temp = NULL;
 if (head1->next == NULL)
 {//如果list1为空,则list3头指针指向list2
  head3 = head2;
  list2.phead->next = NULL;//将list2消除,防止析构函数析构list2时找不到对象
 }
 else if (head2->next == NULL)
 {//如果list1为空,则list3头指针指向list2
  head3 = head1;
  list1.phead->next = NULL;//将list1消除,防止析构函数析构list2时找不到对象
 }
 head1 = head1->next;
 list1.phead->next = NULL;//将list1消除,防止析构函数析构list2时找不到对象
 head2 = head2->next;
 list2.phead->next = NULL;//将list2消除,防止析构函数析构list2时找不到对象
 if (head1->data < head2->data)
 {//如果list1的第一个元素小于list2的第一个元素
  head3->next = head1;//将list1的第一个元素接到list3上
  head1 = head1->next;
 }
 else
 {
  head3->next = head2;//将list2的第一个元素接到list3上
  head2 = head2->next;
 }
 temp = head3->next;//指向list3当前最后一个节点
 while (head1 != NULL && head2 != NULL)
 {
  if (head1->data < head2->data)
  {
   temp->next = head1;//将list1中的元素接到list3的后面
   temp = head1;
   head1 = head1->next;
  }
  else
  {
   temp->next = head2;//将list2中的元素接到list3的后面
   temp = head2;
   head2 = head2->next;
  }
 }
 if (NULL == head1) //将list1或者list2中的剩余部分接到list3的后面
 {
  temp->next = head2;
 }
 else if (NULL == head2)
 {
  temp->next = head1;
 }
}<PRE class=cpp name="code"> </PRE><PRE class=cpp name="code">//主函数</PRE><PRE class=cpp name="code">int _tmain(int argc, _TCHAR* argv[])
{
 MyList<int> list1, list2, list3; 
    for (int i = 1; i <= 10; i ++) 
    { 
       list1.Insert(i, 3*i); 
    list2.Insert(i, 2*i);
   }
   MergeList(list1, list2, list3);
 list3.Show();

return 0;
}</PRE><BR>
<PRE></PRE>
<PRE></PRE>
<PRE></PRE>
<PRE></PRE>
<PRE></PRE>
<PRE></PRE>
<PRE></PRE>
<PRE></PRE>
</PRE>

(0)

相关推荐

  • JavaScript实现的链表数据结构实例

    此例是javascript来建立链表.. 并对此进行了排序.. 还可以在GenericList一般链表上进行扩展. 实现各种排序及增,删,改结点.. 复制代码 代码如下: function Node(){   this.data=null;   this.next=null; } function GenericList(){   this.head=null;   this.current=null;   //打出所有的链表结点   this.print= function(){   this

  • 逆转交替合并两个链表的解析与实现

    逆转交替合并两个链表,即从一个链表的尾指针指向另一个链表的尾指针,依次逆转交替进行合并.下面就通过实例来详细的介绍该逆转交替合并两个链表的思路与实现代码. 一.问题描述 链表A和B A: 1->2->3->4 B: a->b->c->d 请逆转交替合并两个链表,示例结果如下: 4->d->3->c->2->b->1->a 节点类型定义如下: classNode { public Node next; ... } 二.源代码: 传

  • JavaScript中数据结构与算法(三):链表

    我们可以看到在javascript概念中的队列与栈都是一种特殊的线性表的结构,也是一种比较简单的基于数组的顺序存储结构.由于javascript的解释器针对数组都做了直接的优化,不会存在在很多编程语言中数组固定长度的问题(当数组填满后再添加就比较困难了,包括添加删除,都是需要把数组中所有的元素全部都变换位置的,javascript的的数组确实直接给优化好了,如push,pop,shift,unshift,split方法等等-) 线性表的顺序存储结构,最大的缺点就是改变其中一个元素的排列时都会引起

  • C#通过链表实现队列的方法

    本文实例讲述了C#通过链表实现队列的方法.分享给大家供大家参考.具体实现方法如下: public class Node { public int Data { get; set; } public Node Next { get; set; } public Node(int data) { this.Data = data; } } public class Queue { private Node _head; private Node _tail; private int _count =

  • C语言实现双向链表

    这个小代码是我凭自己对指针和链表的理解和认识,自己实现的,没有参考其他人的代码,如果有相同的地方,那真的只是巧合,代码我在ubuntu 15.04下测试通过,可能存在很多错误和漏洞. doublelist.c /************************************************************************* > File Name: doublelist.c > Author: ChenYiLiang > Mail: chenyilian

  • Java采用循环链表结构求解约瑟夫问题

    本文实例讲述了Java采用循环链表结构求解约瑟夫问题的方法.分享给大家供大家参考.具体分析如下: 这是第一次java考试的试题,对于没看过链表的同学来说就不会做,现在回头看看,还真不难. 约瑟夫问题: 有n个人,其编号分别为1,2,3,-,n.这n个人按顺序排成一个圈.现在给定s和d,从第s个人开始从1依次报数,数到d的人出列,然后又从下一个人开始又从1开始依次报数,数到d的人又出列,如此循环,直到最后所有人出列为止.要求定义一个节点类,采用循环链表结构求解约瑟夫问题. 以下java版的答案:

  • C++语言实现线性表之链表实例

    本文实例讲述了C++语言实现线性表之链表实现方法.分享给大家供大家参考.具体分析如下: 插入.删除结点的代码有点多,但这样提高了代码的可读性,且不增加时间复杂度,不会影响程序性能 #include <iostream> using namespace std; template<typename T> class CList; template<class T> class Node { friend CList<T>; private: T m_data;

  • C++实现的链表类实例

    本文实例讲述了C++实现的链表类.分享给大家供大家参考.具体如下: #include <iostream> using namespace std; class linklist { private: struct node { int data; node *link; }*p; public: linklist(); void append( int num ); void add_as_first( int num ); void addafter( int c, int num );

  • 探讨:将两个链表非降序合并为一个链表并依然有序的实现方法

    已知两个链表list1和list,2,各自非降序排列,将它们合并成另外一个链表list3,并且依然有序,要求保留所有节点.实现过程中,list1中的节点和list2中的节点都转移到了list3中,注意泛型的友元函数的用法.程序如有不足之处,还望指正!!!定义List类 复制代码 代码如下: #include "stdafx.h"#include <iostream> using namespace std;template<class T>struct Node

  • C++ sort排序之降序、升序使用总结

    一.升序 C++ sort 函数十分方便,可以对内置类型也可对自定义类型进行快速排序,内置类型的使用比较简单,下面主要讨论自定义类型的排序,一般有如下几种使用方法: 1.1 重载比较操作符 比如,我们现有一批学生,要根据他们的成绩进行升序排序,成绩如果相等则根据名字升序排序,那么我们可以如下操作: struct Student{ string name; int grade; Student(string name, int grade) : name(name), grade(grade){}

  • 详解Java sort()数组排序(升序和降序)

    我们在学习 Java 的过程中肯定会遇到对数组进行升序或降序等排序问题,本节主要介绍如何实现 Java 数组的升序和降序.Java 语言使用 Arrays 类提供的 sort() 方法来对数组进行排序. 升序 使用 java.util.Arrays 类中的 sort() 方法对数组进行升序分为以下两步: 导入 java.util.Arrays 包. 使用 Arrays.sort(数组名) 语法对数组进行排序,排序规则是从小到大,即升序. 假设在数组 scores 中存放了 5 名学生的成绩,现在

  • JS实现数组按升序及降序排列的方法

    本文实例讲述了JS实现数组按升序及降序排列的方法.分享给大家供大家参考,具体如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>数组数字大小排序</title> </head> <body> <p>让数组按照升序降序排列</p> <p>这里写

  • MySQL8新特性:降序索引详解

    前言 MySQL 8.0终于支持降序索引了.其实,从语法上,MySQL 4就支持了,但正如官方文档所言,"they are parsed but ignored",实际创建的还是升序索引. 无图无真相,同一个建表语句,看看MySQL 5.7和8.0的区别. create table slowtech.t1(c1 int,c2 int,index idx_c1_c2(c1,c2 desc)); MySQL 5.7 mysql> show create table slowtech.

  • MySQL8新特性之降序索引底层实现详解

    什么是降序索引 大家可能对索引比较熟悉,而对降序索引比较陌生,事实上降序索引是索引的子集. 我们通常使用下面的语句来创建一个索引: create index idx_t1_bcd on t1(b,c,d); 上面sql的意思是在t1表中,针对b,c,d三个字段创建一个联合索引. 但是大家不知道的是,上面这个sql实际上和下面的这个sql是等价的: create index idx_t1_bcd on t1(b asc,c asc,d asc); asc表示的是升序,使用这种语法创建出来的索引叫做

  • java 实现Comparable接口排序,升序、降序、倒叙

    本人由于项目开发中需要对查询结果list进行排序,这里根据的是每一个对象中的创建时间降序排序.本人讲解不深,只实现目的,如需理解原理还需查阅更深的资料. 1.实现的效果 2.创建排序的对象 package com.practice.test.comparable; import java.util.Date; /** * 描述:要比较的对象 * * @author cui * @create 2018-12-18 14:07 */ public class MySortBean implemen

  • MySQL8.0中的降序索引

    前言 相信大家都知道,索引是有序的:不过,在MySQL之前版本中,只支持升序索引,不支持降序索引,这会带来一些问题:在最新的MySQL 8.0版本中,终于引入了降序索引,接下来我们就来看一看. 降序索引 单列索引 (1)查看测试表结构 mysql> show create table sbtest1\G *************************** 1. row *************************** Table: sbtest1 Create Table: CREAT

  • 利用stream sorted进行降序排序

    根据value值的大小进行降序排序,并进行截取. public static void main(String[] args) { List<Map<String, Object>> list = Lists.newArrayList(); Map<String, Object> map = Maps.newHashMap(); map.put("id", 1); map.put("value", 20); list.add(ma

  • MySQL 8中新增的这三大索引 隐藏、降序、函数

    目录 MySQL 8中的隐藏.降序.函数索引 一.隐藏索引 1.隐藏索引概述 2.隐藏索引操作 二.降序索引 1.降序索引概述 2.降序索引操作 三.函数索引 1.函数索引概述 2.函数索引操作 MySQL 8中的隐藏.降序.函数索引 一.隐藏索引 1.隐藏索引概述 MySQL 8.0开始支持隐藏索引(invisible index),不可见索引. 隐藏索引不会被优化器使用,但仍然需要进行维护. 应用场景:软删除.灰度发布. 在之前MySQL的版本中,只能通过显式的方式删除索引,如果删除后发现索

随机推荐