【数据结构与算法 刷题系列】合并两个有序链表

简介: 【数据结构与算法 刷题系列】合并两个有序链表

一、问题描述

二、解题思路详解

合并两个有序链表的思路

创建一个新的链表,将两个链表的节点元素按大小顺序逐个尾插到新的链表中,最后返回新链表的首节点地址

解题的步骤

  1. 先对两个链表进行判空,如果任意一个链表为空,直接返回另一个链表首节点地址
  2. 创建两个指针用来指向新链表的首节点和尾节点,初始都指向NULL
  3. 创建两个指针p1 p2用来遍历两个有序链表,初始分别指向两个链表的首节点
  4. 然后进入while循环,当两个链表都未遍历完成时执行循环,先比较p1 和p2指向的节点的元素大小,将较小的节点插入新链表的尾部
  5. 插入的过程——先判断新链表是否为空
    如果为空,新链表的首尾指针都指向该节点
    如果不为空,执行尾插。将新链表尾节点的next指针执行该节点,再将尾指针向后移动
    完成一个节点插入后,将该节点所属的链表的遍历指针向后移动
  6. 出循环后,说明两个链表其中有一个先遍历完成了
    此时进行判断,哪个指针指向空,就将另一个链表剩余节点挂在新链表尾部
  7. 最后,返回新链表的首节点指针

代码的优化

存在问题——每次插入都要判断链表是否为空

解决办法——创建不存储数据的头结点,让链表不为空

不要忘记使用完成后对动态申请空间释放
最后返回新链表第一个有效节点的地址

三、C语言代码实现

struct ListNode 
{   //单链表结构
    int val;
    struct ListNode* next;
    
};
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{
    if (list1 == NULL)//先判断两个链表是否为空
        return list2;
    if (list2 == NULL)
        return list1;
 
    struct ListNode* newhead = (struct ListNode*)malloc(sizeof(struct ListNode));//新链表头节点指针
    struct ListNode* newtail = newhead;//新链表尾指针
 
    struct ListNode* p1 = list1;//遍历两个链表的指针
    struct ListNode* p2 = list2;
 
    while (p1 && p2)//两个链表都不为空执行循环
    {   //哪个链表节点数据小,就将其尾插到新链表
        if (p1->val > p2->val)
        {
            newtail->next = p2;
            p2 = p2->next;
        }
        else
        {
            newtail->next = p1;
            p1 = p1->next;
        }
        newtail = newtail->next;//新链表尾指针向后移动
    }
    //一定有一个链表先走到空,出循环后将另一个链表剩余节点尾插到新链表
    if (p1 == NULL)
    {
        newtail->next = p2;
    }
    if (p2 == NULL)
    {
        newtail->next = p1;
    }
    struct ListNode* ret = newhead->next;
    free(newhead);
    newhead = NULL;
    return ret;
}


相关文章
|
1月前
|
存储 算法 Perl
数据结构实验之链表
本实验旨在掌握线性表中元素的前驱、后续概念及链表的建立、插入、删除等算法,并分析时间复杂度,理解链表特点。实验内容包括循环链表应用(约瑟夫回环问题)、删除单链表中重复节点及双向循环链表的设计与实现。通过编程实践,加深对链表数据结构的理解和应用能力。
55 4
|
2月前
|
存储 算法
【❤️算法笔记❤️】-每日一刷-21、合并两个有序链表
【❤️算法笔记❤️】-每日一刷-21、合并两个有序链表
108 0
|
24天前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
44 5
|
1月前
|
存储 C语言
【数据结构】手把手教你单链表(c语言)(附源码)
本文介绍了单链表的基本概念、结构定义及其实现方法。单链表是一种内存地址不连续但逻辑顺序连续的数据结构,每个节点包含数据域和指针域。文章详细讲解了单链表的常见操作,如头插、尾插、头删、尾删、查找、指定位置插入和删除等,并提供了完整的C语言代码示例。通过学习单链表,可以更好地理解数据结构的底层逻辑,提高编程能力。
86 4
|
1月前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
1月前
|
存储 Web App开发 算法
2024重生之回溯数据结构与算法系列学习之单双链表【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构之单双链表按位、值查找;[前后]插入;删除指定节点;求表长、静态链表等代码及具体思路详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
1月前
|
算法
数据结构之购物车系统(链表和栈)
本文介绍了基于链表和栈的购物车系统的设计与实现。该系统通过命令行界面提供商品管理、购物车查看、结算等功能,支持用户便捷地管理购物清单。核心代码定义了商品、购物车商品节点和购物车的数据结构,并实现了添加、删除商品、查看购物车内容及结算等操作。算法分析显示,系统在处理小规模购物车时表现良好,但在大规模购物车操作下可能存在性能瓶颈。
48 0
|
1月前
|
C语言
【数据结构】双向带头循环链表(c语言)(附源码)
本文介绍了双向带头循环链表的概念和实现。双向带头循环链表具有三个关键点:双向、带头和循环。与单链表相比,它的头插、尾插、头删、尾删等操作的时间复杂度均为O(1),提高了运行效率。文章详细讲解了链表的结构定义、方法声明和实现,包括创建新节点、初始化、打印、判断是否为空、插入和删除节点等操作。最后提供了完整的代码示例。
59 0
|
2月前
|
存储
[数据结构] -- 双向循环链表
[数据结构] -- 双向循环链表
26 0
|
2月前
|
数据可视化 搜索推荐 Python
Leecode 刷题笔记之可视化六大排序算法:冒泡、快速、归并、插入、选择、桶排序
这篇文章是关于LeetCode刷题笔记,主要介绍了六大排序算法(冒泡、快速、归并、插入、选择、桶排序)的Python实现及其可视化过程。
21 0