数据结构每日一题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;
}
相关推荐
Helibo4412 分钟前
GESPC++六级复习
java·数据结构·算法
EnticE15236 分钟前
[高阶数据结构]二叉树经典面试题
数据结构·算法·面试
_星辰大海乀2 小时前
数据库约束
java·数据结构·数据库·sql·链表
爱喝茶的小茶2 小时前
构造+简单树状
数据结构·算法
小王努力学编程3 小时前
高并发内存池(三):TLS无锁访问以及Central Cache结构设计
jvm·数据结构·c++·学习
草莓啵啵~3 小时前
数据结构--二叉树
数据结构
Watink Cpper3 小时前
[数据结构高阶]并查集初识、手撕、可以解决哪类问题?
数据结构·图论··并查集
什码情况5 小时前
星际篮球争霸赛/MVP争夺战 - 华为OD机试真题(A卷、Java题解)
java·数据结构·算法·华为od·面试·机试
.Vcoistnt5 小时前
Codeforces Round 1024 (Div. 2)(A-D)
数据结构·c++·算法·贪心算法·动态规划·图论
程序员爱钓鱼5 小时前
循环语句:for、range -《Go语言实战指南》
java·数据结构·算法