力扣_21 合并两个有序链表

目录

1 力扣_21 合并两个有序链表

1.1 示例

1.2 思路

1.2.1 方法1:直接创建head / tail

1.2.2 用一个哨兵位的头节点


1 力扣_21 合并两个有序链表

链接:力扣-合并两个有序数组

009c4ce1e51d4426aba5c826d28a497f.png

1.1 示例

862b054ff8ae4d5cb78696b3eecaf1d9.png

8aecc42ff94542cfa406942694a36a53.png

1.2 思路

依次比较链表中的节点,每次取小的节点,尾插到新链表

1.2.1 方法1:直接创建head / tail

d7aa126098fb4c7bbc9ab0d88c0ee352.png

f29958ce74074db3a4aab8dc21fe7a9a.png

 struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
     struct ListNode* head, * tail;
     head = tail = NULL;
 ​
     if (list1 == NULL)
     {
         return list2;   //当其中一个链表为NULL,则直接返回另一个链表即可
     }
     else if (list2 == NULL)
     {
         return list1;
     }
     else
         {(list2->val) > (list1->val) ? (head = tail = list1, list1 = list1->next) : (head = tail = list2, list2 = list2->next);
             // 三目操作符,上来先给head和tail一个值,如果是l1小就把l1给head/tail
             // 否则l2
         while (list1 && list2)
         {
             if ((list1->val) > (list2->val))
             {
                 tail->next = list2;
                 list2 = list2->next;    // 比较大小,谁小,谁放tail的next,head不变,记录头
             }
             else
             {
                 tail->next = list1;
                 list1 = list1->next;
             }
             tail = tail->next;
         }
         //  最后,当一个为NULL时,退出上面循环,并将剩下的一个链表直接加入tail的next后
         if (list1 == NULL)
         {
             tail->next = list2;
         }
         else
         {
             tail->next = list1;
         }
         return head;
     }
 }

1.2.2 用一个哨兵位的头节点

3f5c584cf47b486eb8929863c823d700.png

 struct ListNode* mergeTwoLists2(struct ListNode* list1, struct ListNode* list2) {
     struct ListNode* head, * tail;
     head = tail = NULL;
     if (list1 == NULL)
     {
         return list2;
     }
     else if (list2 == NULL)
     {
         return list1;
     }
     else
     {
         
         head = tail = (struct ListNode*)malloc(sizeof(struct ListNode));
         //  直接malloc一个哨兵位头节点
         while (list1 && list2)
         {
             if ((list1->val) > (list2->val))
             {
                 tail->next = list2;
                 list2 = list2->next;
             }
             else
             {
                 tail->next = list1;
                 list1 = list1->next;
             }
             tail = tail->next;
         }
         if (list1 == NULL)
         {
             tail->next = list2;
         }
         else
         {
             tail->next = list1;
         }
         return head->next;
     }
     //  因为是malloc,所以记得释放,不过应先保存到一个指针里,再释放
     struct ListNode* list = head->next;
     free(head);
     return list;
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值