您现在的位置是:首页 >技术交流 >【力扣-21】合并两个有序链表网站首页技术交流

【力扣-21】合并两个有序链表

Djx_hmbb 2023-06-05 20:00:02
简介【力扣-21】合并两个有序链表

🖊作者 : Djx_hmbb
📘专栏 : 数据结构
😆今日分享 : 英文文章里 : TL;DR 或者 tl;dr。
网上英文解释有两种,一种是Too long;Don’t read,另一种是Too long;Didn’t read。意思是:“文章太长了,读不下去了”。
请添加图片描述

✔题目链接;

【力扣-21】合并两个有序链表

✔题目:

在这里插入图片描述

✔解题思路:

:>不用头结点–依次比较每个节点的大小

创建的 指针 : 新链表的头指针,比较节点大小的当前指针,next指针.请添加图片描述

:> 使用头结点–依次比较每个节点的大小

创建的指针 :

✔代码详情;

🔎不用头结点

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
    struct ListNode* p1 = list1;
    struct ListNode* p2 = list2;
    struct ListNode* newNode = NULL,*cur = newNode;
    //如果链表1为空时,返回链表2
    if (list1 == NULL) {
        return list2;
    }
    //如果链表2为空时,返链表1
    if (list2 == NULL) {
        return list1;
    }
    //判断当前节点是否为空,为空时则结束查找比较
    while (p1 && p2) {
        struct ListNode* next1 = p1->next;
        struct ListNode* next2 = p2->next;
        //判断新链表的头结点是否为空
        //头结点为空
        if (newNode == NULL) {
            //取小值进行尾插
            if (p1->val < p2->val) {
                cur = newNode = p1;
                p1 = next1;
                if (next1)
                    next1 = next1->next;
            }
            else  {
                cur = newNode = p2;
                p2 = next2;
                if (next2)
                    next2 = next2->next;
            }
        }
     //头结点不为空
        else {
            if (p1->val < p2->val) {
                cur->next = p1;
                cur = p1;
                p1 = next1;
                if (next1)
                    next1 = next1->next;
            }
            else  {
                cur->next = p2;
                cur = p2;
                p2 = next2;
                if (next2)
                    next2 = next2->next;
            }        
        }
    }
    //判断是哪一个链表先为空的,将不为空的链接到新链表中
    if (p1 == NULL) {
        cur->next = p2;
    }
    else if (p2 == NULL) {
        cur->next = p1;
    }
    //返回
    return newNode;
}

🔎用头结点

struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
        if(l1 == NULL)
            return l2;
        else if(l2 == NULL)
           return l1;
             
        struct ListNode* head = NULL, *tail = NULL;
        //创建空链表
    	head = tail = (struct ListNode*)malloc(sizeof(struct ListNode));
        tail->next = NULL;
        while(l1 && l2)
        {
            // 取小的进行尾插
            if(l1->val < l2->val)
            {
                tail->next = l1;
                tail = tail->next;

                l1 = l1->next;
            }
            else
            {
                tail->next = l2;
                tail = tail->next;

                l2 = l2->next;
            }
        }
        //剩余元素直接拼接
        if(l1)
            tail->next = l1;
        else
            tail->next = l2;

        struct ListNode* list = head->next;
        free(head);
        return list;
}

📖总结 :

带头结点的好处 :

  • 不用考虑新的链表头指针是否为空的情况(代码更简短) .

不带头节点的好处 :

  • 考试基本都是不带头节点的情况 , 这样更有利于我们思维训练 .

感谢家人的阅读,若有不准确的地方 欢迎在评论区指正!

家人们,点个请添加图片描述再走呗~

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。