C语言合并两个带头节点升序排列链表

下面我将为你详细讲解“C语言合并两个带头节点升序排列链表”的完整攻略。

问题描述

假设有两个带头节点的升序排列链表,现在需要将它们合并成一个新的升序排列链表。

解决方案

  1. 定义一个新的链表来存储合并后的结果,定义三个指针分别指向两个输入链表的头节点和新链表的尾节点。

  2. 循环比较两个链表的当前节点,将较小的节点接入新链表的尾部,并将新链表的尾节点指向新加入的节点。

  3. 如果一个链表为空,直接将另一个链表的剩余节点加入新链表的尾部即可。

  4. 最后返回新链表的头节点即为合并后的结果。

下面是基于上述方案的代码实现:

#include <stdio.h>
#include <stdlib.h>

typedef struct node {
    int value;
    struct node *next;
} Node;

/**
 * 合并两个带头节点升序排列链表
 * @param h1 第一个链表的头节点
 * @param h2 第二个链表的头节点
 * @return 合并后的升序排列链表的头节点
 */
Node *merge_sorted_lists(Node *h1, Node *h2) {
    Node *head = (Node *) malloc(sizeof(Node)); // 新链表的头节点
    Node *tail = head; // 新链表的尾节点,初始指向头节点
    Node *p1 = h1->next; // 第一个链表的当前节点
    Node *p2 = h2->next; // 第二个链表的当前节点

    // 循环比较两个链表的当前节点
    while (p1 != NULL && p2 != NULL) {
        if (p1->value < p2->value) {
            // 将较小的节点接入新链表的尾部
            tail->next = p1;
            tail = tail->next;
            p1 = p1->next;
        } else {
            tail->next = p2;
            tail = tail->next;
            p2 = p2->next;
        }
    }

    // 如果一个链表为空,直接将另一个链表的剩余节点加入新链表的尾部
    if (p1 != NULL) {
        tail->next = p1;
    }

    if (p2 != NULL) {
        tail->next = p2;
    }

    // 返回新链表的头节点即为合并后的结果
    return head;
}

int main() {
    // 示例1
    Node *h1 = (Node *) malloc(sizeof(Node)); // 第一个链表的头节点
    h1->next = NULL;
    Node *p1 = NULL; // 第一个链表的尾节点
    for (int i = 1; i <= 3; i++) {
        Node *node = (Node *) malloc(sizeof(Node));
        node->value = i * 2 - 1;
        node->next = NULL;
        if (p1 == NULL) {
            h1->next = node;
        } else {
            p1->next = node;
        }
        p1 = node;
    }

    Node *h2 = (Node *) malloc(sizeof(Node)); // 第二个链表的头节点
    h2->next = NULL;
    Node *p2 = NULL; // 第二个链表的尾节点
    for (int i = 1; i <= 4; i++) {
        Node *node = (Node *) malloc(sizeof(Node));
        node->value = i * 2;
        node->next = NULL;
        if (p2 == NULL) {
            h2->next = node;
        } else {
            p2->next = node;
        }
        p2 = node;
    }

    Node *head = merge_sorted_lists(h1, h2);
    Node *p = head->next;
    while (p != NULL) {
        printf("%d ", p->value);
        p = p->next;
    }
    printf("\n");

    // 示例2
    Node *h3 = (Node *) malloc(sizeof(Node)); // 第三个链表的头节点
    h3->next = NULL;
    Node *q1 = NULL; // 第三个链表的尾节点
    for (int i = 1; i <= 3; i++) {
        Node *node = (Node *) malloc(sizeof(Node));
        node->value = i * 2;
        node->next = NULL;
        if (q1 == NULL) {
            h3->next = node;
        } else {
            q1->next = node;
        }
        q1 = node;
    }

    Node *h4 = (Node *) malloc(sizeof(Node)); // 第四个链表的头节点
    h4->next = NULL;
    Node *q2 = NULL; // 第四个链表的尾节点
    for (int i = 1; i <= 3; i++) {
        Node *node = (Node *) malloc(sizeof(Node));
        node->value = i * 2 - 1;
        node->next = NULL;
        if (q2 == NULL) {
            h4->next = node;
        } else {
            q2->next = node;
        }
        q2 = node;
    }

    Node *head2 = merge_sorted_lists(h3, h4);

    Node *q = head2->next;
    while (q != NULL) {
        printf("%d ", q->value);
        q = q->next;
    }

    return 0;
}

示例说明

这里提供两个示例:

  1. 示例1中存在两个输入链表,分别为{1,3,5}和{2,4,6,8},合并后的升序排列链表为{1,2,3,4,5,6,8}。

  2. 示例2中存在两个输入链表,分别为{2,4,6}和{1,3,5},合并后的升序排列链表为{1,2,3,4,5,6}。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言合并两个带头节点升序排列链表 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • python数据融合函数pd.merge()(数据酷客学习总结)

    当你想要使用Python中的数据融合函数pd.merge()时,你可以使用pandas库来实现。pd.merge()函数可以将两个或多个数据框按照指定的键(key)进行合并。下面是pd.merge()函数的完整攻略: 导入pandas库 在Python代码中,你需要导入pandas库。下面是一个示例: python import pandas as pd 创…

    other 2023年5月8日
    00
  • 关于crontab:在特定时间段内每5分钟运行一次cron

    以下是关于“关于crontab:在特定时间段内每5分钟运行一次cron”的完整攻略,包含两个示例。 在特定时间段内每5分钟运行一次cron 在Linux中,我们可以使用crontab命令来定时运行任务。如果我们需要在特定时间段内每5分钟运行一次cron,可以使用以下攻略。 1. 编辑crontab文件 我们可以使用crontab命令编辑crontab文件。以…

    other 2023年5月9日
    00
  • 解决微信浏览器缓存站点入口文件(IIS部署Vue项目)

    解决微信浏览器缓存站点入口文件(IIS部署Vue项目)攻略 1. 问题描述 在使用微信浏览器访问部署在IIS上的Vue项目时,可能会遇到缓存站点入口文件的问题。这意味着当你更新了Vue项目的代码后,微信浏览器仍然加载旧的入口文件,导致无法看到最新的更改。 2. 解决方案 为了解决这个问题,我们可以采取以下步骤: 步骤 1: 修改Vue项目的入口文件名 首先,…

    other 2023年8月3日
    00
  • 如何用eclipse运行导入的maven项目

    以下是详细讲解“如何用Eclipse运行导入的Maven项目”的完整攻略,过程中至少包含两条示例说明的标准Markdown格式文本: 如何用Eclipse运行导入的Maven项目 Maven是一款常用的Java项目管理工具,而Eclipse是一款常用的Java集成开发环境。本文将介绍如何在Eclipse中运行导入的Maven项目。 步骤一:导入Maven项目…

    other 2023年5月10日
    00
  • @RefreshScope 自动刷新配置文件的实例讲解

    来一份完整攻略。 什么是@RefreshScope @RefreshScope 是 Spring Cloud 提供的一种自动刷新配置文件的机制,它可以实时刷新被标记为 @RefreshScope 的 Bean 中的属性。 使用该注解时,需要将需要动态刷新的配置加入Spring Cloud的配置中心(如Spring Cloud Config Server),之…

    other 2023年6月25日
    00
  • linuxcentos7find命令

    以下是详细讲解“Linux CentOS 7 find命令的完整攻略”的标准Markdown格式文本,包含两个示例说明: Linux CentOS 7 find命令的完整攻略 在Linux CentOS 7中,find命令是一个非常有用的工具,可以用于查找文件和目录。本攻略将介绍如何使用find命令。 基本语法 find命令的基本语法如下: find [pa…

    other 2023年5月10日
    00
  • iOS12开发者预览版和公测版怎样升级至iOS12正式版?

    这是一个关于如何将iOS 12开发者预览版和公测版升级至iOS 12正式版的完整攻略。 在开始之前,请确保备份了所有重要数据,并确保设备有足够的电量和稳定的网络连接。 升级iOS 12开发者预览版至正式版的方法: 步骤一:打开设备上的“设置”应用程序 步骤二:点击“通用”选项 步骤三:点击“软件更新”选项 步骤四:在此界面上,您将看到“iOS12即将上市,点…

    other 2023年6月26日
    00
  • ios学习——uialertcontroller详解

    iOS学习——UIAlertController详解 在iOS开发中,弹窗是必不可少的一个组件。UIAlertController是iOS 8之后引入的一个更加强大和灵活的弹窗组件,取代了之前的UIAlertView和UIActionSheet。本文将详细介绍UIAlertController的用法和相关属性。 UIAlertController的类型 UI…

    其他 2023年3月29日
    00
合作推广
合作推广
分享本页
返回顶部