• 合并两个升序链表,哨兵位的理解


    开始时也要判断是否有一个链表本来就是空,如果是,直接返回另外一个链表
    在这里插入图片描述
    代码:

    struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){
        if(list1==NULL)
        {
            return list2;
        }
    
         if(list2==NULL)
        {
            return list1;
        }
    struct ListNode* cur1=list1;
    struct ListNode* cur2=list2;
    struct ListNode* newnode=NULL;
    struct ListNode* tail=NULL;
    while(cur1&&cur2)
    {
        if(cur1->val<=cur2->val)
        {
            if(tail==NULL)
            {
                newnode=tail=cur1;
            }else
            {
                tail->next=cur1;
                tail=tail->next;
            }
            cur1=cur1->next;
        }else
        {
             if(tail==NULL)
            {
                newnode=tail=cur2;
            }else
            {
                tail->next=cur2;
                tail=tail->next;
    
            }
            cur2=cur2->next;
        }
    }
    if(cur1)
    {
        tail->next=cur1;
    }
    if(cur2)
    {
        tail->next=cur2;
    }
    return newnode;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    上述代码因为如果拿下的数是第一个节点,那么就要头插。这样就不得不判断
    在这里插入图片描述
    这样显得反锁了一点,那么我们是否有一种方法,使得不管是不是头插,都可以只用
    在这里插入图片描述
    这一个代码就实现呢,那么我们就引进了带哨兵位的链表
    在这里插入图片描述
    所以对于此题,我们还可以用哨兵位的方法来做:
    在这里插入图片描述

    代码:

    struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){
        if(list1==NULL)
        {
            return list2;
        }
    
         if(list2==NULL)
        {
            return list1;
        }
    struct ListNode* cur1=list1;
    struct ListNode* cur2=list2;
    struct ListNode* newnode=NULL;
    struct ListNode* tail=NULL;
    newnode=tail=(struct ListNode* )malloc(sizeof(struct ListNode));
    while(cur1&&cur2)
    {
        if(cur1->val<=cur2->val)
        {
            
                tail->next=cur1;
                tail=tail->next;
            
            cur1=cur1->next;
        }else
        {
              tail->next=cur2;
                tail=tail->next;
    
            
            cur2=cur2->next;
        }
    }
    if(cur1)
    {
        tail->next=cur1;
    }
    if(cur2)
    {
        tail->next=cur2;
    }
    struct ListNode* per=newnode;
    newnode=newnode->next;
    free(per);
    return newnode;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
  • 相关阅读:
    Redis的特性以及使用场景
    树洞外链网盘系统php源码去除底部版权优化版
    计算机毕设 深度学习 机器学习 酒店评价情感分析算法实现
    mysql创建用户以及给用户授予权限
    二:OpenCV图片叠加逻辑运算
    前(jsencrypt)后(node-rsa/crypto)端 RSA 加密与解密
    cf1716(A、B)、cf1714(A、B、C)
    CentOS 8迁移Rocky Linux 8手记
    3_python高阶_线程—多线程-共享全局变量
    彻底删除vscode以及vscode的插件记录
  • 原文地址:https://blog.csdn.net/qq2127189274/article/details/133029992