单链表OJ题:LeetCode--21.合并两个有序链表

简介: LeetCode--21.合并两个有序链表:详细解题过程以及图解和完整代码。

朋友们、伙计们,我们又见面了,今天给大家带来的是LeetCode中21题:合并两个有序链表

数 据 结 构:数据结构专栏

作          者:stackY、

C  语   言  :C语言专栏

LeetCode :LeetCode刷题训练营

LeetCode--21.合并两个有序链表 :https://leetcode.cn/problems/merge-two-sorted-lists/description/

目录

1.题目介绍

2.实例演示

3.解题思路


1.题目介绍

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

image.gif编辑

2.实例演示

image.gif编辑

3.解题思路

合并两个有序链表我们通常采用的方法是遍历两个链表,然后取较小的结点进行尾插,尾插法和我们之前见到过的OJ题:删除链表元素中使用的方法很相似,当然这里也是要区分第一次尾插和接下来的尾插,如果有一个链表为空那么直接返回另外一个链表的头结点,如果两个链表都不为空,这时如果一个结点尾插完了,另外一个结点还没有结束,这时就不需要在依次尾插,直接将剩下的结点链接在后面即可:

image.gif编辑

代码演示:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){
    struct ListNode* phead1 = list1;
    struct ListNode* phead2 = list2;
    //新的头和新的尾
    struct ListNode* newhead = NULL;
    struct ListNode* tail = NULL;
    //有一个链表为空则返回其它链表的头
    if(phead1 == NULL)
    {
        return phead2;
    }
    if(phead2 == NULL)
    {
        return phead1;
    }
    //正常情况
    while(phead1 && phead2)
    {
        //小的进行尾插
        if(phead1->val > phead2->val)
        {
            //第一次尾插
            if(tail == NULL)
            {
                newhead = tail = phead2;
            }
            else
            {
                //尾插
                tail->next = phead2;
                //更新尾
                tail = tail->next;
            }
            //迭代
            phead2 = phead2->next;
        }
        else
        {
            if(tail == NULL)
            {
                newhead = tail = phead1;
            }
            else
            {
                tail->next = phead1;
                tail = tail->next;
            }
            phead1 = phead1->next;
        }
    }
    //一个链表尾插完之后将剩下的直接链接在尾的后面
    if(phead1 == NULL)
    {
        tail->next = phead2;
    }
    if(phead2 == NULL)
    {
        tail->next = phead1;
    }
    return newhead;
}
image.gif

今天的博客就分享到这里,喜欢的老铁留下你的三连,感谢感谢!我们下期再见!!

目录
相关文章
|
24天前
|
存储 算法 C语言
C语言手撕实战代码_循环单链表和循环双链表
本文档详细介绍了用C语言实现循环单链表和循环双链表的相关算法。包括循环单链表的建立、逆转、左移、拆分及合并等操作;以及双链表的建立、遍历、排序和循环双链表的重组。通过具体示例和代码片段,展示了每种算法的实现思路与步骤,帮助读者深入理解并掌握这些数据结构的基本操作方法。
|
2月前
|
算法
LeetCode第24题两两交换链表中的节点
这篇文章介绍了LeetCode第24题"两两交换链表中的节点"的解题方法,通过使用虚拟节点和前驱节点技巧,实现了链表中相邻节点的交换。
LeetCode第24题两两交换链表中的节点
|
2月前
|
存储 算法
LeetCode第86题分隔链表
文章介绍了LeetCode第86题"分隔链表"的解法,通过创建两个新链表分别存储小于和大于等于给定值x的节点,然后合并这两个链表来解决问题,提供了一种简单易懂且操作原链表的解决方案。
LeetCode第86题分隔链表
|
2月前
|
存储 算法
LeetCode第83题删除排序链表中的重复元素
文章介绍了LeetCode第83题"删除排序链表中的重复元素"的解法,使用双指针技术在原链表上原地删除重复元素,提供了一种时间和空间效率都较高的解决方案。
LeetCode第83题删除排序链表中的重复元素
|
2月前
|
算法
LeetCode第23题合并 K 个升序链表
这篇文章介绍了LeetCode第23题"合并K个升序链表"的解题方法,使用分而治之的思想,通过递归合并链表的方式解决了这个难题。
LeetCode第23题合并 K 个升序链表
|
2月前
|
C++ 索引
leetcode 707.设计链表
本文提供了解决LeetCode 707题"设计链表"的C++实现,包括单链表的节点定义和类方法实现,如添加节点、获取节点值、删除节点等。
|
2月前
|
算法
LeetCode第92题反转链表 II
文章分享了LeetCode第92题"反转链表 II"的解法,通过使用四个指针来记录和更新反转链表段的头部、尾部以及前一个和后一个节点,提供了一种清晰且易于理解的解决方案。
LeetCode第92题反转链表 II
|
2月前
|
算法
LeetCode第21题合并两个有序链表
该文章介绍了 LeetCode 第 21 题合并两个有序链表的解法,通过创建新链表,依次比较两个链表的头节点值,将较小的值插入新链表,直至其中一个链表遍历完,再将另一个链表剩余部分接到新链表后面,实现合并。
LeetCode第21题合并两个有序链表
|
2月前
|
算法
LeetCode第19题删除链表的倒数第 N 个结点
该文章介绍了 LeetCode 第 19 题删除链表的倒数第 N 个结点的解法,通过使用快慢双指针,先将快指针移动 n 步,然后快慢指针一起遍历,直到快指针到达链尾,从而找到倒数第 N 个结点的前一个结点进行删除,同时总结了快慢指针可减少链表遍历次数的特点。
LeetCode第19题删除链表的倒数第 N 个结点
|
4天前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行