力扣---LeetCode21. 合并两个有序链表(链表经典题)

简介: 第八弹——力扣LeetCode每日一题

前言


焦虑不会消除明天的悲伤 只会让你今天的力量荡然无存

本章的内容是力扣每日随机一题的部分方法的解析

提示:以下是本篇文章正文内容,下面案例可供参考

21. 合并两个有序链表


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

链接:

21. 合并两个有序链表link

方法一:取小尾插


1.1代码:


struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{
    struct ListNode* head=NULL;
    struct ListNode* tail=NULL;
    if(list1==NULL)//判断是否是空链表
        return list2;
    if(list2==NULL)//判断是否是空链表
        return list1;
    while(list1&&list2)
    {
        if(list1->val<list2->val)
        {
            if(tail==NULL)
            {
                head=tail=list1;
            }
            else
            {
                tail->next=list1;
                tail=tail->next;
            }
            list1=list1->next;
        }
        else
        {
            if(tail==NULL)
            {
                head=tail=list2;
            }
            else
            {
                tail->next=list2;
                tail=tail->next;
            }
            list2=list2->next;
        }
    }
    if(list1)
    {
        tail->next=list1;
    }
    if(list2)
    {
        tail->next=list2;
    }
    return head;
}

1.2 流程图:


1.3 注意:


要注意判断list1和;ist2是否是空链表

要考虑第一次插入的情况是没有结点的

方法二:带哨兵位


所谓带哨兵位的链表,就是一个附加的链表的节点,该节点作为第一个节点,它的值域并不存储任何东西,只是为了操作的方便引用的。

如果一个链表有哨兵节点的话,那么线性表的第一个元素应该是链表的第二个节点.

2.1代码:


struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{
    struct ListNode* head=NULL;
    struct ListNode* tail=NULL;
    head=tail=(struct ListNode*)malloc(sizeof(struct ListNode));
    if(list1==NULL)
        return list2;
    if(list2==NULL)
        return list1;
    while(list1&&list2)
    {
        if(list1->val<list2->val)
        {
            tail->next=list1;
            tail=tail->next;
            list1=list1->next;
        }
        else
        {
            tail->next=list2;
            tail=tail->next;
            list2=list2->next;
        }
    }
    if(list1)
    {
        tail->next=list1;
    }
    if(list2)
    {
        tail->next=list2;
    }
    struct ListNode* del=head;
    head=head->next;
    free(del);
    del=NULL;
    return head;
}

2.2流程图:


总结


Ending,今天的力扣每日一题内容就到此结束啦,如果后续想了解更多,就请关注我吧。

相关文章
|
15天前
|
Python
【Leetcode刷题Python】21. 合并两个有序链表
介绍了几种不同的方法来合并多个已排序的链表,包括暴力求解、使用小顶堆以及分而治之策略。
25 2
|
5天前
【bug记录】旋转链表与力扣报错:member access within null pointer of type ‘struct ListNode‘
【bug记录】旋转链表与力扣报错:member access within null pointer of type ‘struct ListNode‘
|
4天前
|
算法
LeetCode第21题合并两个有序链表
该文章介绍了 LeetCode 第 21 题合并两个有序链表的解法,通过创建新链表,依次比较两个链表的头节点值,将较小的值插入新链表,直至其中一个链表遍历完,再将另一个链表剩余部分接到新链表后面,实现合并。
LeetCode第21题合并两个有序链表
|
5天前
|
算法
【算法】合并两个有序链表(easy)——递归算法
【算法】合并两个有序链表(easy)——递归算法
【算法】合并两个有序链表(easy)——递归算法
|
1月前
【数据结构OJ题】合并两个有序链表
力扣题目——合并两个有序链表
30 8
【数据结构OJ题】合并两个有序链表
|
1月前
|
Java
力扣经典150题第六十题:反转链表 II
力扣经典150题第六十题:反转链表 II
14 1
|
1月前
链表6(法二好理解)------ 7-6 sdut-C语言实验-有序链表的归并分数 20
链表6(法二好理解)------ 7-6 sdut-C语言实验-有序链表的归并分数 20
12 0
|
1月前
sdut 链表6-------7-6 sdut-C语言实验-有序链表的归并
sdut 链表6-------7-6 sdut-C语言实验-有序链表的归并
10 0
|
13天前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
26 6
|
13天前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
40 2