数据结构每日一题day17(链表)★★★★★

题目描述:假设有两个按元素值递增次排列的线性表,均以单链表形式存储。请编与算法将这两个单链表归并为一个按元素值依次递减排列的单链表,并要求利用原来两个单链表的结点存放归并后的单链表。

算法思想:

1.初始化:

创建一个新的头结点(用于结果链表)。

定义指针 p 和 q 分别遍历两个链表。

使用头插法将节点插入结果链表(确保递减顺序)。

2.归并过程:

比较 p 和 q 的当前节点值,选择较大者插入结果链表的头部。

移动对应的指针(p 或 q)到下一个节点。

重复上述步骤,直到其中一个链表遍历完毕。

3.处理剩余节点:

将未遍历完的链表剩余节点依次头插到结果链表中。

4.返回结果:

返回新链表的头结点。

复杂度分析:

时间复杂度:O(n + m),其中 n 和 m 分别是两个链表的长度。需要遍历所有节点。

空间复杂度:O(1),仅使用常数个额外指针变量,复用原节点。

代码实现:

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
    int data;
    struct Node *next;
} Node, *LinkedList;

// 创建递增链表
LinkedList createList() {
    LinkedList L = (LinkedList)malloc(sizeof(Node));
    L->next = NULL;
    Node *tail = L;
    int x;
    printf("输入递增序列(以-1结束):");
    while (scanf("%d", &x), x != -1) {
        Node *newNode = (Node *)malloc(sizeof(Node));
        newNode->data = x;
        newNode->next = NULL;
        tail->next = newNode;
        tail = newNode;
    }
    return L;
}

// 归并两个递增链表为递减链表
LinkedList mergeDescending(LinkedList La, LinkedList Lb) {
    LinkedList Lc = (LinkedList)malloc(sizeof(Node)); // 结果链表的头结点
    Lc->next = NULL;

    Node *p = La->next; // 遍历 La
    Node *q = Lb->next; // 遍历 Lb

    while (p != NULL && q != NULL) {
        if (p->data <= q->data) {
            // 头插法插入 p
            Node *next = p->next;
            p->next = Lc->next;
            Lc->next = p;
            p = next;
        } else {
            // 头插法插入 q
            Node *next = q->next;
            q->next = Lc->next;
            Lc->next = q;
            q = next;
        }
    }

    // 处理剩余节点
    while (p != NULL) {
        Node *next = p->next;
        p->next = Lc->next;
        Lc->next = p;
        p = next;
    }
    while (q != NULL) {
        Node *next = q->next;
        q->next = Lc->next;
        Lc->next = q;
        q = next;
    }

    // 释放原链表的头结点(可选)
    free(La);
    free(Lb);

    return Lc;
}

// 打印链表
void printList(LinkedList L) {
    Node *p = L->next;
    while (p != NULL) {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}

int main() {
    printf("创建链表 La:\n");
    LinkedList La = createList();
    printf("创建链表 Lb:\n");
    LinkedList Lb = createList();

    printf("La: ");
    printList(La);
    printf("Lb: ");
    printList(Lb);

    LinkedList Lc = mergeDescending(La, Lb);
    printf("归并后的递减链表 Lc: ");
    printList(Lc);

    return 0;
}
相关推荐
All for pursuit.6 小时前
【动态规划-1】121.买卖股票的最佳时机
数据结构·c++·算法·leetcode·动态规划
Logic1016 小时前
C语言/数据结构位运算题解:异或XOR找出优秀项目组中的“独特编号“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
fj800j8 小时前
首助记账本新增「标签管理」功能:跨分类归集项目账目,一个账本管完所有事
数据结构·经验分享·笔记·学习·分布式账本
垆边人似月.8 小时前
分割数组的最大值最小化(200分 / 二分答案 + 贪心)
数据结构·算法·排序算法
程序员清风10 小时前
排序算法:从冒泡排序到归并排序
数据结构·算法·排序算法
Ada's20 小时前
【计算机基础系列】003:Python数据结构
开发语言·数据结构·python
wanderist.1 天前
线性筛法详解:从筛质数到欧拉函数、Möbius 函数与约数函数
java·数据结构·算法
All for pursuit.1 天前
【设计-1】208.实现Trie (前缀树)
数据结构·c++·算法·leetcode
程序员清风1 天前
哈希表:从键值映射到高效查找
数据结构·哈希算法·散列表
Logic1011 天前
C语言/数据结构字符串题解:最短循环节——找出能重复构成原串的最短基础子串
c语言·数据结构·字符串·枚举·时间复杂度·算法题·kmp优化