【LeetCode21】合并两个有序链表

该文介绍了如何使用归并思想和尾插法合并两个有序链表,分别展示了不带哨兵位和带哨兵位的头结点尾插方法,处理了空指针问题,并提供了相应的C语言代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:

21. 合并两个有序链表 - 力扣(LeetCode)

题目描述:

解题思路:归并思想+链表尾插

1、不带哨兵位的头结点尾插

定义head和tail的指针,并指向空,两个有序链表从头结点位置开始比较值大小,较小的值尾插到新链表上。

代码实现:

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){
    if(list1==NULL)//这里解决出现空指针的问题 list1 【】list2【0】
    return list2;
    if(list2==NULL)
    return list1;
        struct ListNode* head,*tail;
        head=tail=NULL;
        while(list1&&list2)
        {
            if(list1->val<list2->val)
            {
            if(tail==NULL)
            {
                head=tail=list1;
                list1=list1->next;
            }
            else
            {
                tail->next=list1;
                tail=tail->next;
                list1=list1->next;
            }

            }
            else
            {
                if(tail==NULL)
                {
                    head=tail=list2;
                    list2=list2->next;
                }
                else
                {
                    tail->next=list2;
                    tail=tail->next;
                    list2=list2->next;
                }
            }
        }
//销毁带哨兵位的头结点
         if(list1)
         tail->next=list1;
         if(list2)
         tail->next=list2;
         return head;
}

按照思路编写,可能会遇到空指针问题 

 

2、带哨兵位的头结点尾插 

创建哨兵位的头结点,不存储有效数据,并用head和tail指针指向头节点,两个有序链表从头结点位置开始比较值大小,较小的值尾插到新链表上。

代码实现 :

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{
                 struct ListNode* head,*tail;
//创建哨兵位头结点
                 head=tail=(struct ListNode*)malloc(sizeof(struct ListNode));
                 tail->next=NULL;
                 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);
                 return head;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值