3.两个有序单链表合并为一个有序的单链表

原创 2012年03月23日 15:24:37

单链表的基本操作   包括 :链表的创建(头插法,尾插法),链表的遍历,两个单调递增的链表合并为一个单调递增的链表,两个单调递增的链表合并为一个单调递减的链表

 

#include <cstdlib>
#include <iostream>
using namespace std;

//定义单链表的接点
typedef struct Node{
        int data;
        struct Node * next;
        }Nodes; 
//将两个单调递增链表合并成一个 单调递增链表
void merge(Node * a,Node * b,Node * &c){
     Node * p=a->next;//永远指向a的最小的接点
     Node * q=b->next; //永远指向b的最小的接点
     Node * r;//永远指向c的最后一个接点
     c=a; //使用a的头结点
     c->next=NULL;
     free(b);//释放b的头结点
     r=c;//当前c的最后一个接点 也是它的第一个接点
     
     while(p!=NULL && q!=NULL){
             if((p->data)>(q->data)){
                  r->next=q; q=q->next;
                  r=r->next;
                  }
             else{
                  r->next=p; p=p->next;
                  r=r->next;
                  }
             } 
      if(p!=NULL) r->next=p;//将a的剩余接点 添加到c的后面 
      if(q!=NULL) r->next=q;//将b的剩余接点 添加到c的后面 
     } 
     
//将两个单调递增的单链表合并成一个  单调递减的单链表
 void mergeDown(Node * a,Node * b,Node * &c){
     Node * p=a->next;//永远指向a的最小的接点
     Node * q=b->next; //永远指向b的最小的接点
     Node * r;//即将插入的接点 
     c=a; //使用a的头结点
     c->next=NULL;
     free(b);//释放b的头结点
     
     while(p!=NULL && q!=NULL){
             if((p->data)>(q->data)){
                  r=q; q=q->next;
                  r->next=c->next;
                  c->next=r; 
                  }
             else{
                  r=p; p=p->next;
                  r->next=c->next;
                  c->next=r;
                  }
             } 
      while(p!=NULL){//将a的剩余接点 添加到c的后面 
                   r=p; p=p->next;
                  r->next=c->next;
                  c->next=r;
                  }
      while(q!=NULL){//将b的剩余接点 添加到c的后面 
                  r=q;q=q->next;
                  r->next=c->next;
                  c->next=r;
                  }
     } 
//创建链表   尾插法 
void createList(Node * &node ,int data[],int length){
     Node * p;//指向最后一个接点 
     Node * q;//指向新创建的接点
     //创建头结点
     node=(Node *)malloc(sizeof(Node));
     node->next=NULL;
     
     p=node; 
     int i;
     for(i=1;i<=length;i++){
             q=(Node *)malloc(sizeof(Node));
             q->data=data[i];
             p->next=q;
             p=q;
           }     
            p->next=NULL;
     } 

//创建链表  头插法
void createListHead(Node * &node ,int data[],int length){
       Node * q;//指向新创建的接点
       
       //创建头结点
     node=(Node *)malloc(sizeof(Node));
     node->next=NULL;
     
      int i;
     for(i=length;i>=1;i--){
             q=(Node *)malloc(sizeof(Node));
             q->data=data[i];
             q->next=node->next;
             node->next=q;
           }     
     } 
 
//遍历单链表
void showList(Node * node){
     Node * p;//指向当前遍历的接点
     if(node!=NULL)
     p=node->next;
     while(p!=NULL){
             printf("%d-->",p->data);
             p=p->next;
             } 
     } 



int main(int argc, char *argv[])
{
    Node * node=NULL;
    Node * node2=NULL;
     Node * node3=NULL;
    int data[11];
     int data2[11];
    int i;
    for(i=1;i<=10;i++){
                  data[i]=i*i  ;         
                      }
    for(i=1;i<=10;i++){
                  data2[i]=i ;         
                      }
    int length=10;
    createList(node ,data,length);
    createListHead(node2 ,data2,length);
    showList(node);
    printf("\n");
    showList(node2);
    printf("\n");
    mergeDown(node,node2,node3); 
    showList(node3);
    
    system("PAUSE");
    return EXIT_SUCCESS;
}


 

算法题:合并两个有序的链表

题目:已知有两个有序的单链表,其头指针分别为head1和head2,实现将这两个链表合并的函数: Node* ListMerge(Node *head1,Node *head2) ...
  • JXH_123
  • JXH_123
  • 2014年08月04日 16:50
  • 16665

将两个有序链表合并成一个有序链表

问题定义:         写一个函数SortedMerge函数,该函数有两个参数,都是递增的链表,函数的功能就是合并这两个递增的链表为一个递增的链表,SortedMerge的返回值是新的链表。新链...
  • lalor
  • lalor
  • 2012年04月05日 21:02
  • 48806

02-线性结构1 两个有序链表序列的合并 (15分)

本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个递增的整数序列。 函数接口定义: List Merge( List L1, List L2 ); 其中List结构定义如下: t...
  • qq_33406883
  • qq_33406883
  • 2016年09月24日 21:04
  • 5324

如何将两个有序链表合并成一个有序链表。

有两个带头节点的有序链表,如何把他们合成一个有序链表?(假设链表带头节点) 我们通过取出其中一条链表的头节点作为合成后的有序链表的头节点(当然,这里也可以自己重新生成一个节点来作为头节点,但是使用原...
  • nitibu
  • nitibu
  • 2015年08月11日 17:22
  • 1773

两个有序链表序列的合并

02-线性结构1 两个有序链表序列的合并   (15分) 本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个递增的整数序列。 函数接口定义: List Merge( L...
  • ccDLlyy
  • ccDLlyy
  • 2016年09月24日 15:55
  • 5082

将两个有序链表合并成一个有序链表——搜狐畅游笔试题归来

合并两个有序链表:递归算法:#include using namespace std;/*节点的类定义*/class Node{public: int data; Node * next; Node(...
  • piaojun_pj
  • piaojun_pj
  • 2010年10月17日 15:09
  • 10450

将两个有序链表合并成一个有序链表

问题定义:         写一个函数SortedMerge函数,该函数有两个参数,都是递增的链表,函数的功能就是合并这两个递增的链表为一个递增的链表,SortedMerge的返回值是新的链表。新链...
  • ItJavawfc
  • ItJavawfc
  • 2015年02月10日 01:04
  • 1418

非递减合并两个有序单链表

#include #include #include using namespace std; typedef struct Node { int data; struct No...
  • Weiguang_123
  • Weiguang_123
  • 2014年04月18日 00:43
  • 2229

Java将两个有序链表合并为一个有序链表、将两个有序数组合并成一个有序数组

有序链表合并题目:已知两个链表head1和head2各自有序,请把它们合并成一个链表依然有序。结果链表要包含head1和head2的所有节点,即使节点值相同。 分析:此题目使用链表结构,目的是为了...
  • joson793847469
  • joson793847469
  • 2016年08月21日 11:22
  • 2402

经典算法——合并K个有序链表

一、题目要求: 将K个有序链表合并为一个有序链表 二、实现方法: 方法一:利用最小堆方法 用一个大小为K的最小堆(用优先队列+自定义降序实现)(优先队列就是大顶堆,队头元素最大,自定义为降序后,就...
  • geekmanong
  • geekmanong
  • 2016年06月01日 21:46
  • 5338
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:3.两个有序单链表合并为一个有序的单链表
举报原因:
原因补充:

(最多只允许输入30个字)