• 合并两个排序的单链表


    【题目】

    输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是依照递增排序的。


    【分析】

    合并单链表,须要找到头结点,对照两个链表头结点后,确定头结点,再确定头结点下一个结点,循环递归的如前面一样操作确定每一个结点位置,同一时候考虑边界条件,假设两个链表为空。则肯定无需合并了,就是空链表,假设一个链表为空,还有一个不为空,则返回不为空的链表。详细分析流程能够看以下的样例:

    这里写图片描写叙述


    【測试代码】

    #include<stdio.h>
    #include<stdlib.h>
    #include<stack>
    
    typedef int data_type;
    
    typedef struct Node node_t;// 给struct Node取个别名node_t
    typedef struct Node * node_ptr;//给struct Node*取个别名node_ptr
    
    typedef struct Node
    {
        data_type data;
        struct Node *node_next;//node_next是一个指向结构的指针,告诉指针要指向的地址就要付给它一个结构类型地址
    };
    
    //链表初始化
    node_t * init()
    {
        node_ptr p;
        p = (node_t *)malloc(sizeof(node_t));
        p->node_next = NULL;
        return p;
    }
    //在链表后面插入结点
    node_t *insert_back(node_ptr p , data_type data)
    {
    
    
        node_ptr pnew = (node_t *)malloc(sizeof(node_t));
        pnew ->node_next = NULL;
        pnew ->data = data;
    
        p->node_next = pnew;
    
        return pnew;
    }
    
    
    node_t * merge(node_ptr list1_head, node_ptr list2_head)
    {
        if(list1_head == NULL)
            return list2_head;
        else if(list2_head == NULL)
            return list1_head;
        node_ptr merge_head = NULL;
        if(list1_head ->data < list2_head->data)
        {
            merge_head = list1_head;
            merge_head->node_next  = merge(list1_head->node_next,list2_head);
        }
        else
        {
            merge_head = list2_head;
            merge_head->node_next = merge(list1_head, list2_head->node_next);
        }
    
        return merge_head;
    }
    
    //正常打印
    void print(node_ptr p)
    {
        if(!p)
        {
                printf("no data, you think too much");
                return ;
        }
        node_ptr list = p;
        while(list->node_next != NULL)
        {
            printf("%d ", list->data);
            list = list->node_next;
        }
        printf("%d ",list->data);
        printf("
    ");
    
    }
    
    
    
    void main()
    {
        node_ptr pnode1,pnode2, list1,list2;
        pnode1 = init();
        pnode2 = init();
    
        list1 = pnode1;
        list2 = pnode2;
    
        pnode1 = insert_back(pnode1, 1);
        pnode1 = insert_back(pnode1, 3);
        pnode1 = insert_back(pnode1, 5);
    
        pnode2  = insert_back(pnode2 , 2);
        pnode2  = insert_back(pnode2 , 4);
        pnode2  = insert_back(pnode2 , 6);
    
        printf("单链表1为:");
        print(list1->node_next);
        printf("其头结点元素为:%d
    ", list1->node_next->data);
        printf("单链表2为:");
        print(list2->node_next);
        printf("其头结点元素为:%d
    ", list2->node_next->data);
        printf("
    ");
    
        node_t *merge_list = merge(list1->node_next, list2->node_next);
        printf("合并单链表顺序为:");
        print(merge_list);
        printf("头结点元素为:%d
    ",merge_list->data);
        printf("
    ");
    
    }

    【输出】
    这里写图片描写叙述

  • 相关阅读:
    结巴分词 0.14 版发布,Python 中文分词库
    Lazarus 1.0.2 发布,Pascal 集成开发环境
    Android全屏 去除标题栏和状态栏
    服务器日志现 Android 4.2 传将添多项新特性
    Percona XtraBackup 2.0.3 发布
    长平狐 Android 强制设置横屏或竖屏 设置全屏
    NetBeans 7.3 Beta 发布,全新的 HTML5 支持
    CppDepend现在已经支持Linux
    GromJS 1.7.18 发布,服务器端的 JavaScript
    Apache OpenWebBeans 1.1.6 发布
  • 原文地址:https://www.cnblogs.com/yxwkf/p/5226766.html
Copyright © 2020-2023  润新知