单链表---合并两个链表

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

cpp 复制代码
struct ListNode 
{
    int val;
    struct ListNode* next;
};

w

方法一---不使用哨兵位

我们创建一个新链表用于合并两个升序链表, 将两个链表中最小的结点依次尾插到新链表newlist中,当循环结束后,如果list1不为空说明list2为空使循环停止,那么我们将新链表尾插指针cur指向list1,反之指向list2:

cpp 复制代码
    while (list1 && list2)
    {
        if (list1->val < list2->val)
        {
            if (newlist == NULL)
            {
                newlist = cur = list1;
            }
            else
            {
                cur->next = list1;
                cur = cur->next;
            }
            list1 = list1->next;
        }
        else
        {
            if (newlist == NULL)
            {
                newlist = cur = list2;
            }
            else
            {
                cur->next = list2;
                cur = cur->next;
            }
            list2 = list2->next;
        }
    }
    if (list1)
    {
        cur->next = list1;
    }
    if (list2)
    {
        cur->next = list2;
    }
    return newlist;

但是只有这个循环还不行,如果list1与list2开始就为NULL,那么最后cur->next会形成非法访问,因此在代码开始需要进行判断,list1为空则返回list2,list2为空返回list1。

cpp 复制代码
    if (list1 == NULL)
        return list2;
    if (list2 == NULL)
        return list1;

整体代码如下:

cpp 复制代码
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{
    struct ListNode* newlist, * cur;
    newlist = cur = NULL;
    if (list1 == NULL)
        return list2;
    if (list2 == NULL)
        return list1;
    while (list1 && list2)
    {
        if (list1->val < list2->val)
        {
            if (newlist == NULL)
            {
                newlist = cur = list1;
            }
            else
            {
                cur->next = list1;
                cur = cur->next;
            }
            list1 = list1->next;
        }
        else
        {
            if (newlist == NULL)
            {
                newlist = cur = list2;
            }
            else
            {
                cur->next = list2;
                cur = cur->next;
            }
            list2 = list2->next;
        }
    }
    if (list1)
    {
        cur->next = list1;
    }
    if (list2)
    {
        cur->next = list2;
    }
    return newlist;
}

方法二---使用哨兵位

cpp 复制代码
    newlist = (struct ListNode*)malloc(sizeof(struct ListNode));
    cur = newlist;

使用哨兵位的好处在于,循环内部不需要判断有效结点为空的情况,因为哨兵位不是有效结点,哨兵位的next指向第一个有效结点,因此不用担心有效结点为空导致非法访问。

cpp 复制代码
    while(list1&&list2)
    {
        if(list1->val < list2->val)
        {
            cur->next = list1;
            cur=cur->next;
            list1=list1->next;
        }
        else
        {
            cur->next = list2;
            cur=cur->next;
            list2=list2->next;
        }
    }

使用哨兵位的缺陷在于,开辟了额外的空间,在返回之前或者函数结束之前需要释放哨兵位空间并将指向哨兵位的指针置空。

cpp 复制代码
    struct ListNode* tmp = newlist->next;
    free(newlist);
    newlist = NULL;
    return tmp;

那么总体代码如下:

cpp 复制代码
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) 
{
    struct ListNode* newlist ,*cur;
    newlist = (struct ListNode*)malloc(sizeof(struct ListNode));
    cur = newlist;
    if(list1==NULL)
        return list2;
    if(list2==NULL)
        return list1;
    while(list1&&list2)
    {
        if(list1->val < list2->val)
        {
            cur->next = list1;
            cur=cur->next;
            list1=list1->next;
        }
        else
        {
            cur->next = list2;
            cur=cur->next;
            list2=list2->next;
        }
    }
    if(list1)
    {
        cur->next = list1;
    }
    if(list2)
    {
        cur->next = list2;
    }
    struct ListNode* tmp = newlist->next;
    free(newlist);
    newlist = NULL;
    return tmp;
}
相关推荐
马浩同学24 分钟前
【GD32】从零开始学GD32单片机 | DAC数模转换器 + 三角波输出例程
c语言·单片机·嵌入式硬件·mcu
我要学编程(ಥ_ಥ)27 分钟前
一文详解“二叉树中的深搜“在算法中的应用
java·数据结构·算法·leetcode·深度优先
一个没有本领的人34 分钟前
win11+matlab2021a配置C-COT
c语言·开发语言·matlab·目标跟踪
mashagua41 分钟前
RPA系列-uipath 学习笔记3
笔记·学习·rpa
nikoni2343 分钟前
828考研资料汇总
笔记·其他·硬件工程
一只自律的鸡1 小时前
C项目 天天酷跑(下篇)
c语言·开发语言
沐泽Mu1 小时前
嵌入式学习-QT-Day05
开发语言·c++·qt·学习
长安——归故李1 小时前
【C语言】成绩等级制
c语言·开发语言
锦亦之22331 小时前
cesium入门学习二
学习·html
szuzhan.gy2 小时前
DS查找—二叉树平衡因子
数据结构·c++·算法