题目讲解15 合并两个排序的链表

原题链接:

合并两个排序的链表_牛客题霸_牛客网

思路分析:

第一步:写一个链表尾插数据的方法。

复制代码
typedef struct ListNode ListNode;

//申请结点
ListNode* BuyNode(int x)
{
    ListNode* node = (ListNode*)malloc(sizeof(ListNode));
    node->val = x;
    node->next = NULL;
    return node;
}

//尾插
void ListPushBack(ListNode** pphead, int x)
{
    ListNode* NewNode = BuyNode(x);
    if(*pphead == NULL)
    {
        *pphead = NewNode;
    }
    else 
    {
        ListNode* pcur = *pphead;
        while(pcur->next)
        {
            pcur = pcur->next;
        }
        pcur->next = NewNode;
    }
}

第二步:创建三个链表结点。l1 用来遍历链表1,l2用来遍历链表2,RetList 是返回链表。

复制代码
ListNode* RetList = NULL, *l1 = pHead1, *l2 = pHead2;

第三步:进行遍历判断。如果 l1 结点里的值小于 l2 结点里的值,就把 l1 结点里的值尾插到返回链表。反之,就把 l2 结点里是值尾插到返回链表。

复制代码
    while(l1 && l2)
    {
        if(l1->val < l2->val)
        {
            ListPushBack(&RetList, l1->val);
            l1 = l1->next;
        }
        else
        {
            ListPushBack(&RetList, l2->val);
            l2 = l2->next;
        }
    }

循环之前:

第一次循环之后:

第二次循环之后:

第三次循环之后:

第四次循环之后:

第五次循环之后:

如果 l1 或者 l2 遍历到 NULL 的时候,会有一方没有完全遍历完所有结点,所以我们还需要补上两个循环去遍历完 l1 或者 l2。

复制代码
    while(l1)
    {
        ListPushBack(&RetList, l1->val);
        l1 = l1->next;
    }
    while(l2)
    {
        ListPushBack(&RetList, l2->val);
        l2 = l2->next;
    }
    return RetList;

完整代码:

复制代码
struct ListNode* Merge(struct ListNode* pHead1, struct ListNode* pHead2 ) 
{
    ListNode* RetList = NULL, *l1 = pHead1, *l2 = pHead2;
    while(l1 && l2)
    {
        if(l1->val < l2->val)
        {
            ListPushBack(&RetList, l1->val);
            l1 = l1->next;
        }
        else
        {
            ListPushBack(&RetList, l2->val);
            l2 = l2->next;
        }
    }
    while(l1)
    {
        ListPushBack(&RetList, l1->val);
        l1 = l1->next;
    }
    while(l2)
    {
        ListPushBack(&RetList, l2->val);
        l2 = l2->next;
    }
    return RetList;
}
相关推荐
爱coding的橙子7 分钟前
蓝桥杯备赛 Day 20 树基础
数据结构·c++·算法·蓝桥杯·深度优先
F_lander11 分钟前
蓝桥杯冲刺题单--二分
java·算法·蓝桥杯
南林yan32 分钟前
滑动窗口7:30. 串联所有单词的子串
算法
Tisfy36 分钟前
LeetCode 3396.使数组元素互不相同所需的最少操作次数:O(n)一次倒序遍历
算法·leetcode·题解·数组·遍历·哈希表
WG_1737 分钟前
图论:单源最短路(BF算法+迪杰斯特拉算法+spfa算法)
算法·图论
银河小铁骑plus1 小时前
力扣hot100_动态规划
算法·leetcode·动态规划
乌旭2 小时前
英伟达Blackwell架构深度拆解:新一代GPU如何突破算力瓶颈?
数据结构·人工智能·深度学习·机器学习·ai·架构·ai编程
Hello.Reader2 小时前
深入理解 C++ 内置数组(四十三)
开发语言·c++·算法
Vaclee3 小时前
蓝桥杯—数字接龙(dfs+减枝)
算法·蓝桥杯·深度优先
地平线开发者4 小时前
【轻量化】三个经典轻量化网络解读
算法·自动驾驶