首页 > 其他分享 >合并链表

合并链表

时间:2023-09-10 11:11:06浏览次数:43  
标签:LinkList LB LC LA 合并 next 链表 num

例2.3

有两个链表LA和LB,其元素均为非递减有序排列,编写算法,将它们合并成一个链表LC,要求LC也是非递减有序排列。
例如,LA=(2,2,3),LB=(1,3,3,4),则LC=(1,2,2,3,3,3,4)。

#include <stdio.h>
#include <stdlib.h>
#define MAX 100

typedef struct Node
{
    int num;
    struct Node *next;
} Node, *LinkList;

//使用指针的指针进行的初始化,l对应二级指针,*l对应一级指针
void InitLinkList(LinkList *l)
{
    *l = (LinkList)malloc(sizeof(Node)); //建立头结点
    (*l)->next = NULL;                   //建立空的单链表
}

// 头插法,用好头指针控制新节点
void CreateFromHead(LinkList l)
{
    LinkList n;
    int number;
    int flag = 1;
    while (flag)
    {
        scanf("%d", &number);
        if (number != -1)
        {
            n = (LinkList)malloc(sizeof(Node));
            n->num = number;
            n->next = l->next;
            l->next = n;
        }
        else
            flag = 0;
    }
}

// 尾插法,设置一个尾指针进行控制
void CreateFromTail(LinkList l)
{
    LinkList n = l, s;
    int number;
    int flag = 1;
    while (flag)
    {
        scanf("%d", &number);
        if (number != -1)
        {
            s = (LinkList)malloc(sizeof(Node));
            n->next = s;
            n = s; //这里的n相当于尾指针,一直指向链表末尾
            s->next = NULL;
            s->num = number;
        }
        else
            flag = 0;
    }
}

int DeleteLinkList(LinkList l, int index)
{
    int number;
    LinkList temp = l, node;
    for (int i = 0; i < index - 1; i++)
        temp = temp->next;
    node = temp;
    temp = temp->next;
    return number;
}

void PrintLinkList(LinkList l)
{
    LinkList temp = l;
    while (temp->next)
    {
        temp = temp->next;
        printf("%d ", temp->num);
    }
}

// void mergeList(LinkList LA, LinkList LB, LinkList LC)
// {
//     LinkList s;
//     LinkList n = LC;
//     LA = LA->next;
//     LB = LB->next;
//     while (LA && LB)
//     {
//         s = (LinkList)malloc(sizeof(Node));
//         if (LA->num < LB->num)
//         {
//             s->num = LA->num;
//             LA = LA->next;
//         }
//         else
//         {
//             s->num = LB->num;
//             LB = LB->next;
//         }
//         n->next = s;
//         n = s;
//         s->next = NULL;
//     }

//     while (LA)
//     {
//         s = (LinkList)malloc(sizeof(Node));
//         s->num = LA->num;
//         LA = LA->next;
//         n->next = s;
//         n = s;
//         s->next = NULL;
//     }

//     while (LB)
//     {
//         s = (LinkList)malloc(sizeof(Node));
//         s->num = LB->num;
//         LB = LB->next;
//         n->next = s;
//         n = s;
//         s->next = NULL;
//     }
// }

void mergeList(LinkList LA, LinkList LB, LinkList LC)
{
    LinkList pa = LA->next;
    LinkList pb = LB->next;
    LinkList pc = LC;

    while (pa && pb)
    {
        LinkList s = (LinkList)malloc(sizeof(Node));
        if (!s)
        {
            printf("内存分配失败\n");
            exit(1);
        }

        if (pa->num < pb->num)
        {
            s->num = pa->num;
            pa = pa->next;
        }
        else
        {
            s->num = pb->num;
            pb = pb->next;
        }

        pc->next = s;
        pc = s;
        s->next = NULL;
    }

    // 处理剩余元素,哪个有剩余,直接剩余所有的连接上去
    if (pa)
    {
        pc->next = pa;
    }
    else
    {
        pc->next = pb;
    }
}

int main()
{
    LinkList LA, LB, LC;
    InitLinkList(&LA);
    InitLinkList(&LB);
    InitLinkList(&LC);
    CreateFromTail(LA);
    CreateFromTail(LB);
    mergeList(LA, LB, LC);
    PrintLinkList(LC);
    return 0;
}

总结

这里对于合并函数mergeList的改进:
1.改用pa,pb,pc控制LA,LB,LC,防止原有链表头指针的改变。
2.对于剩余部分的处理,不需要使用循环,直接将剩余链表部分整个接上去即可。

标签:LinkList,LB,LC,LA,合并,next,链表,num
From: https://www.cnblogs.com/trmbh12/p/17690914.html

相关文章

  • 代码随想录算法训练营第四天| 24. 两两交换链表中的节点, 19.删除链表的倒数第N个结点
    24.两两交换链表中的节点mydemo(超时)/***Definitionforsingly-linkedlist.*structListNode{*intval;*ListNode*next;*ListNode():val(0),next(nullptr){}*ListNode(intx):val(x),next(nullptr){}*ListNode(intx,Lis......
  • 通用链表的封装
    通用链表能够存储任意类型的数据到链表中,并提供对应的操作万能指针void*C语言中任意类型的指针可以转换成void*类型void*类型指针可以转换成任意类型指针节点:void*ptr; // 数据域指针域;链表结构:头指针数量核心点:1、void*确保能存储任意类型数据2、普通......
  • 排序总结 链表
    排序总结时间复杂度空间复杂度是否能有稳定性选择O(N*N)O(1)×冒泡O(N*N)O(1)✔️插入O(N*N)O(1)✔️归并O(N*logN)O(N)✔️快排(一般指3.0)O(N*logN)O(N*logN)×堆O(N*logN)O(1)×基数排序作为不基于比较的排序,有稳定性基础类型的排序一般排序用快排,因为其时间复杂度常数项更小,需要保持......
  • 小程序网络性能优化:合并请求与智能缓存提升用户体验
    在小程序开发中,网络性能优化是提升用户体验的重要一环。通过合并请求和合理的缓存策略,我们可以有效减少网络请求次数和提升页面加载速度。本文将探讨在小程序中如何优化网络性能,包括合并请求和智能缓存,同时提供代码演示。合并请求合并多个请求可以减少网络延迟,提高加载速度。小程......
  • 代码随想录算法训练营第三天| 203.移除链表元素 707.设计链表 206.反转链表
    203.移除链表元素链表定义structListNode{intval;ListNode*next;ListNode():val(0),next(NULL){};ListNode(intx):val(x),next(NULL){};ListNode(intx,ListNode*next):val(x),next(next){};}1.在原链表上移除链表元素classSolut......
  • 合并顺序表
    例2.3有两个顺序表LA和LB,其元素均为非递减有序排列,编写算法,将它们合并成一个顺序表LC,要求LC也是非递减有序排列。例如,LA=(2,2,3),LB=(1,3,3,4),则LC=(1,2,2,3,3,3,4)。【算法思想】设表LC是一个空表,为使LC也是非递减有序排列,可设两个指针i、j分别指向表LA和LB中的元素,若LA.el......
  • 算法通关村第一关——链表青铜挑战笔记
    算法通关村第一关——链表青铜挑战笔记链表是一种经典的数据结构,在很多软件里大量使用,例如操作系统、JVM等。在面试中链表题目数量少,类型也相对固定,考察频率却非常高,因此我们只要将常见题目都学完就万事大吉了,所以链表特别值得刷。单链表的概念链表的概念单向链表就像一个......
  • 数组模拟链表 模拟栈和队列 单调栈和队列(9/7 9/8)
    单链表数组模拟链表可以加快速度,更利于优化算法#include<iostream>usingnamespacestd;constintN=100010;inte[N],ne[N],head,idx;voidinit(){head=-1;idx=0;}voidadd_head(intx){e[idx]=x;ne[idx]=head;head=idx++;}void......
  • HTML5表格标签和单元格合并
    表格标签<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=,initial-scale=1.0"><title>Document</title></head&g......
  • 剑指 Offer 52. 两个链表的第一个公共节点
    题目链接:剑指Offer52.两个链表的第一个公共节点题目描述:输入两个链表,找出它们的第一个公共节点。解法思路:代码:/***Definitionforsingly-linkedlist.*typeListNodestruct{*Valint*Next*ListNode*}*/funcgetIntersectionNode(headA,h......