【C语言】leetcode每日一题

前言

时间过得真快,马上又要回家了,马上又要开始卷了。不是每朵鲜花都能代表爱情,但是玫瑰做到了;不是每棵树都能耐得住干渴,但是白杨做到了;不是每个人都在追求上进,挑战自我,改变人生,成就梦想,但是在座的各位——你们做到了!希望你们也能努力 成为你们想要的人
在这里插入图片描述

题目描述

这个题很特殊,我已经开始链表的刷题,一个写接口的题,我竟然在leetcode和牛客都看到这些题。不多废话,上点硬菜。
剑指 Offer 25. 合并两个排序的链表

BM4 合并两个排序的链表

这两题竟然无比的相似,让我都怀疑谁超谁的。
ok,少聊闲话,直接上题目。

题目分析

如输入{1,3,5},{2,4,6}时,合并后的链表为{1,2,3,4,5,6},所以对应的输出为{1,2,3,4,5,6},转换过程如下图所示:

输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。
示例1:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

在这里插入图片描述
我们要通过比较两个链表的值去进行排序,该算法的基本思路是:比较两个链表头指针指向节点值的大小,取小的那个节点作为新链表的下一个节点,然后指针向右移动一位,重复以上操作,直到其中一个链表为空,最后再将另一个非空链表接到新链表的末尾即可。

具体来说,该函数接收两个指向链表头结点的指针pHead1和pHead2,判断这两个链表是否为空,如果其中一个为空,则直接返回另一个链表。接着创建虚拟头节点dummyHead,并将p指针指向dummyHead,用来指向排序过程中的最后一个节点。然后进入while循环,循环条件为两个链表都不为空,比较两个链表头结点的值,将值小的头结点加入新链表,并将p指向该节点,再将对应的头指针向右移动一位,以便进行下一轮的比较。如果其中一个链表为空,则直接将另一个非空链表全部接入新链表的末尾。最后,返回dummyHead->next即可。这是方法一
方法二更巧妙
通过用递归更巧妙的写出代码

代码描述

递归方法

struct ListNode* mergeTwoLists(struct ListNode* pHead1, struct ListNode* pHead2) {
    if (pHead1 == NULL)
    {
        return pHead2;
    }
    if (pHead2 == NULL)
    {
        return pHead1;
    }
    struct ListNode* phead = NULL;
    if (pHead1->val > pHead2->val)
    {
        phead = pHead2;
        phead->next = mergeTwoLists(pHead1, pHead2->next);
    }
    else
    {
        phead = pHead1;
        phead->next = mergeTwoLists(pHead1->next, pHead2);

    }
    return phead;
    // write code here
}

普通方法

struct ListNode* mergeTwoLists(struct ListNode* pHead1, struct ListNode* pHead2) {
    // write code here
    if (pHead1 == NULL)
        return pHead2;
    if (pHead2 == NULL)
        return pHead1;
    //创建虚拟头节点,虚拟头节点的next指向合并完成的链表
    struct ListNode* dummyHead = (struct ListNode*)malloc(sizeof(struct ListNode));
    //p节点指向排序过程中最后一个的节点,初始时指向虚拟头节点
    struct ListNode* p = dummyHead;

    while (pHead1 != NULL && pHead2 != NULL)
    {
        if (pHead1->val < pHead2->val)
        {
            p->next = pHead1;//step1时,dummyHead->1
            p = pHead1;//p指向1,依次类推
            pHead1 = pHead1->next;
        }
        else
        {
            p->next = pHead2;//step2时,dummyHead->1->2
            p = pHead2;//p指向2,依此类推
            pHead2 = pHead2->next;
        }
    }

    if (pHead1 != NULL)
        p->next = pHead1;
    if (pHead2 != NULL)
        p->next = pHead2;

    return dummyHead->next;
}

通过用一个哨兵头完成此代码

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值