IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 有序链表的合并 -> 正文阅读

[数据结构与算法]有序链表的合并

?一开始的思路:

????????大体上是对的,但是太浪费空间,每次去create一个新node,用类似于归并排序里面的逐一比较,依次放到newList中,最终也观察到有头链表print的时候,要置为NULL,选择了逐一去销毁->太浪费空间和时间。

解决办法:

????????就直接用指针逐一将目标结点依次有序串联起来,无需去copy相同的结点,最终记得将L1->Next=NULL;L2->Next=NULL;

遇到的问题:

????????段错误

? ? ? ? ? ? ? ? 访问越界了,一开始L1->Next=NULL;L2->Next=NULL;写成了p1->Next=NULL但实际上,p1作为移动指针已经移动到最后了,不能访问Next!!!

最初的代码——>臃肿且有bug

PtrToNode createNode(int data)
{
    PtrToNode newNode=(PtrToNode)malloc(sizeof(struct Node));
    newNode->Data=data;/*有头*/
    newNode->Next=NULL;
    return newNode;
}
void push_back(List list,int data)
{
    if(list==NULL)return ;
    PtrToNode pos=createNode(data);
    PtrToNode pMove=list->Next;
    while(pMove->Next)
    {
        pMove=pMove->Next;
    }
    pMove->Next=pos;
}
List Merge( List L1, List L2 )
{
    if(L1==NULL&&L2==NULL)return NULL;
    if(L1==NULL)return L2;
    if(L2==NULL)return L1;
    List newList=()malloc(sizeof(struct Node));
    //初始化  
    newList->Next=NULL;
    PtrToNode p1=L1->Next;/*有头链表*/
    PtrToNode p2=L2->Next;
    
   while(p1&&p2)//有点个像归并排序->两者必须都要存在
   {
       if(p1->Data<p2->Data)
       {//不为空的时候再去
           push_back(newList,p1->Data);
           p1=p1->Next;
       }
       else
       {
            push_back(newList,p2->Data); 
            p2=p2->Next;
       } 
   }
    while(p1)
    {
        push_back(newList,p1->Data);
        p1=p1->Next;
    }
    while(p2)
    {
        push_back(newList,p2->Data);
        p2=p2->Next;
    }
    //销毁原来的链表
    for(p1=L1,p2=L2;p1||p2;)
    {
        if(p1)
        {
            PtrToNode t=p1->Next;
            free(p1);
            p1=t;
        }
        if(p2)
        {
            PtrToNode t=p2->Next;
            free(p2);
            p2=t;
        }
    }
    return newList;
}

修改后:

? ? ? ? 注意一点:和归并排序逐一比较之后不太一样的一点是->没有再去while逐一放入newList中,直接用链表串联起来即可。

List Merge( List L1, List L2 )
{
    if(L1==NULL)
    {
        if(L2==NULL||L2->Next==NULL)return NULL;
        else if(L1->Next==NULL)return L2;
        else return L1;
    }
    List newList=(List)malloc(sizeof(struct Node));
    //初始化  
    //newList->Next=NULL;//注:newList的作用:始终保存头结点
    List p=newList;//pmove
    PtrToNode p1=L1->Next;/*有头链表*/
    PtrToNode p2=L2->Next;  
   while(p1&&p2)//有点个像归并排序->两者必须都要存在
   {
       if(p1->Data<p2->Data)
       {//不为空的时候再去
           p->Next=p1;
           p1=p1->Next;
       }
       else
       {
            p->Next=p2;
            p2=p2->Next;
       } 
       p=p->Next;
   }
    if(p1)//优化
    {
        p->Next=p1;
    }
    if(p2)
    {
        p->Next=p2;//优化后的结果
    }
    L1->Next=NULL;//一开始错写成:p1->Next==NULL会导致访问越界。
    L2->Next=NULL;
    return newList;
}

?reference:

02-线性结构1 两个有序链表序列的合并  题目要求实现一个函数,将两个链表表示的递增整数序列合并为一个非递减的整数序列。  这道题较为基础,主要考察C语言中链表的基本操作。只要会“连接”链表,考虑清楚比较过程和前后关系不难想出思路,关键是http://www.west999.com/info/html/chengxusheji/C-C--/20180618/4195557.html

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-07-20 19:09:52  更:2022-07-20 19:10:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 23:22:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码