数据结构每日一题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;
}
相关推荐
阿让啊6 小时前
C语言strtol 函数使用方法
c语言·数据结构·c++·单片机·嵌入式硬件
superlls8 小时前
(算法 哈希表)【LeetCode 349】两个数组的交集 思路笔记自留
java·数据结构·算法
Ripple1231210 小时前
数据结构:顺序表与链表
数据结构·链表
一个响当当的名号10 小时前
B树,B+树,B*树(无代码)
数据结构·b树
古译汉书12 小时前
嵌入式铁头山羊stm32-ADC实现定时器触发的注入序列的单通道转换-Day26
开发语言·数据结构·stm32·单片机·嵌入式硬件·算法
野犬寒鸦12 小时前
力扣hot100:相交链表与反转链表详细思路讲解(160,206)
java·数据结构·后端·算法·leetcode
GalaxyPokemon13 小时前
LeetCode - 1089. 复写零
数据结构
失散1313 小时前
分布式专题——1.2 Redis7核心数据结构
java·数据结构·redis·分布式·架构
zzzsde14 小时前
【数据结构】强化训练:从基础到入门到进阶(1)
数据结构
奔跑吧 android14 小时前
【linux kernel 常用数据结构和设计模式】【数据结构 3】【模拟input子系统input_dev和input_handler之间的多对多关系】
linux·数据结构·input·kernel·input_dev·input_handler·input_handle