链表合并

设有两个无头结点的单链表,头指针分别为ha,hb,链中有数据域data,链域next,两链表的数据都按递增序存放,现要求将hb表归到ha表中,且归并后ha仍递增序,归并中ha表中已有的数据若hb中也有,则hb中的数据不归并到ha中,hb的链表在算法中不允许破坏。

#include<stdio.h> /// no have dead node  ha and hb >>ha
#include<stdlib.h>
typedef int ElemType;
typedef struct LNode{
	ElemType data;
	struct LNode *next;
}LNode,*LinkList;

LinkList CreateLink(int n)  /// 创建表
{
    LinkList h=(LinkList)malloc(sizeof(LNode)),q;
    scanf("%d",&h->data);
    h->next=NULL;
    q=h;
    for(int i=1;i<n;i++){
        LinkList p=(LinkList)malloc(sizeof(LNode));
        scanf("%d",&p->data);
        p->next=NULL;

        q->next=p;
        q=p;
    }
    return h;  /// 返回头指针
}
void print(LinkList h);
LinkList MergeList(LinkList ha,LinkList hb)
{
    LinkList p,hc,pc;
    p=(LinkList)malloc(sizeof(LNode));
    p->next=NULL;

    hc=pc=p;
    while(ha&&hb)
    {
        if(ha->data < hb->data){
            p=(LinkList)malloc(sizeof(LNode));
            p->next=NULL;
            p->data=ha->data;

            pc->next=p;pc=p;ha=ha->next;
        }
        else if(ha->data > hb->data){
            p=(LinkList)malloc(sizeof(LNode));
            p->next=NULL;
            p->data=hb->data;

            pc->next=p;pc=p;hb=hb->next;
        }
        else{
            /**
            p=(LinkList)malloc(sizeof(LNode));
            p->next=NULL;
            p->data=ha->data;

            pc->next=p;
            pc=p;
            ha=ha->next;
            */
            hb=hb->next; /// ha中有hb的元素,hb直接指向下一结点
        }
    }
    pc->next=ha?ha:hb;  ///  指向剩余的链表

    return hc->next;    /// 返回无头结点的指针
}
void print(LinkList h)
{

    while(h!=NULL){
        printf("%d ",h->data);
        h=h->next;
    }
    printf("\n");
}

int main()
{
    int n,m;
    scanf("%d",&n);   ///ha
    LinkList ha=CreateLink(n);

    scanf("%d",&m);    ///hb
    LinkList hb=CreateLink(m);

    printf("\nBefore MergeList\n");
    print(ha);
    print(hb);

    ha=MergeList(ha,hb);

    printf("After MergeList\n");
    print(ha);
    print(hb);

    return 0;
}

/**
6
1 5 7 9 34  75
5
0 4 5 5 76
*/

实验结果,hb插入ha中,并且hb不变,ha仍然递增

时间: 2024-10-23 17:12:52

链表合并的相关文章

将两个有序链表合并

题目:已知两个链表head1 和head2 各自有序,请把它们合并成一个链表依然有序.(保留所有结点,即便大小相同) 循环实现: 1.重新申请一个头结点,使用指针p指向他,每新加一个结点,就将指针p后移一位,即指针p永远指向新链表的尾结点 2.由于所用链表第一个结点不赋值,因此指针需要开始从头结点的下一个结点开始判断,如果两个指针都为非空,将data域较小的指针连在新链表的末尾 3.当两个指针有一个到达链表的结尾时,将没有到达末尾的链表连接到新链表之后 递归实现: 1.函数返回条件是有一个链表结

双链表&amp;链表合并&amp;多项式相加算法

//单链表的合并 //链表合并 //两个链表必须是有序的 #define Maxsize 5 typedef  int elemtype; typedef struct linklist { elemtype data; struct linklist *next; }Linklist; //建立链表1 Linklist *CreateList1 () { int i,data ; Linklist *head, *p, *q; head=p=(Linklist  *)malloc(sizeof

单链表合并排序实现

原题是要实现两个已排序的单链表合并后还是已排序,但我在网上查了很多都无法直接实现.对于初学者给个算法是没多大用的,下面给出完整代码.主要思路就是先接尾再排序.而一般书是直接开始分情况if...else if...else嵌套排序.比较复杂. /*关键:两个有序单链表的合并:其实本程序可以实现任意两个单链表的合并排序,思想就是 *1.建两个链表2.合并两个链表3.对合并后的链表排序4.打印 *关键函数:linkDList 直接连接两个链表;selectsort 单链表的选择排序*/ #define

17.12.31 链表合并

链表合并 描述 定义一种单向链表,链表结点LinkNode包含一个整数和一个指向下一个节点的指针.编写下面四个子函数: 1.建立链表: 从标准输入读取数据,并创建链表,返回创建的链表头 LinkNode *CreateLinkList(); 2.合并链表:参数是两个链表的头指针,返回合并后链表的头指针.合并后的链表仍然有序. LinkNode *MergeLinkList(LinkNode *a, LinkNode *b); 3.遍历并显示合并后的链表的元素. void DisplayLinkL

链表--合并两个有序链表

leetcode 21 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 还是采用递归的方法,先贴出代码: public ListNode mergeTwoLists(ListNode l1, ListNode l2) { if( l1 == null ) { return l2; } if( l2 == null ) {

有序链表合并C语言递归版--我稍微会一点编程

假期最后一天,闲着没事编个程,天天吆喝自己不会编程,其实还是稍微会一点的. ??以下是一个有序链表合并的代码,一刻钟内盲写,花了10分钟左右调试通过,通篇只有一个if语句作为递归退出条件! #include <stdio.h> #include <stdlib.h> int a[] = {1,3,5,7,8,10,11,12,15,19,21,22,24,25,26}; int b[] = {2,4,5,6,9,16,17,18,27,30,31}; struct list { s

c# 有序链表合并 链表反转

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace LinkedListTest { class Program { static void Main(string[] args) { LinkList<int> linkA = new LinkList<int>(); linkA.A

每日一码——链表合并

今天的每日一码为大家介绍了,将两个链表合并为一条 最后得到的结果如下: 当然本题可以在合并的时候,对节点进行一些处理使得得到的是一条有序的列表. 也可以在ListCode中定义链表排序方法,在合并后调用,即可得到有序的链表. 由于小编水平有限,如有不足,还请不吝赐教!!!此处也是重点,记下记下.微信搜索关注油墨山公众号,获取更多文章咨询!!! ◆◆油墨未干,为何停下双手!◆◆ 感谢关注!微信号:youmoshan 原文地址:https://www.cnblogs.com/skylife/p/11

A与B链表合并成C链表(链表的归并)

A与B链表合并成C链表(链表的归并) 已知两个有序递增A链表和B链表(非空),将两个链表合并为C链表(同为递增有序),需要我们对链表的概念有一定掌握 对节点所需条件以及节点之间建立关系有所掌握. 这个题的重点是,并没有说明两个链表的具体长度,即两个链表可能不一样长,所以,在处理的时候需要注意,当某一个链表 操作完毕,另一个链表剩下的部分则可以直接接入C链表当中. 1 void merge(LNode *A,LNode *B,LNode *C) 2 { 3 LNode *p = A->next;

链表习题(7)-将两个递增单链表合并成一个递减单链表

1 /*将两个递增单链表合并成一个递减单链表*/ 2 /* 3 算法思想:两个链表已经按元素值递增次序排序,将其合并时,均从第一个结点起进行比较,将较小的 4 结点链入链表中,同时后移工作指针.由于结果链表是递减的,故使用头插法建立新链表.比较结束后, 5 可能会有一个链表非空,此时用头插法将剩下的结点依次插入新链表中即可. 6 */ 7 void Union_List(LinkList& La,LinkList& Lb) 8 { 9 LNode *r, *pa = La->next