• 【LeetCode】21. 合并两个有序链表


    虚拟头结点的方式最为简便。

    也是一种链表的解题方式。

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

    虚拟结点

    1. class Solution {
    2. public:
    3. ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
    4. ListNode* head=new ListNode(-1);
    5. ListNode* temp=head;
    6. while(list1&&list2){
    7. if(list1->valval){
    8. temp->next=list1;
    9. list1=list1->next;
    10. }
    11. else{
    12. temp->next=list2;
    13. list2=list2->next;
    14. }
    15. temp=temp->next;
    16. }
    17. temp->next=!list1?list2:list1;
    18. return head->next;
    19. }
    20. };

    这里的问题在于:合并之后,要链上剩余的部分,你得判断出来哪个更长一些。

    由于ListNode这种并不是stl,无法取到长度。

    那么我们就要不停的移动表头,然后找到非空的那一个就是了。

    !list1?list2:list1表示的就是,如果list1是空的,那就说明剩余的是list2,我们接上list2就好了。

    另外,在写的时候发现一个问题,那就是第一句ListNode* head=new ListNode(-1);

     这说明一个问题,我虽然是虚拟的,但是我最后要返回的是我的next,那么我不可能初始的时候就设置为空,那样的话没意义了,最后也取不到。

    故,要是用new的方式的话,他就是一直存在的,而这之后的temp,才是指向了这一点,最后通过变化的temp进行的连接,使得最后可以返回head->next成为最后的结果。


    递归

    1. class Solution {
    2. public:
    3. ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
    4. if (l1 == nullptr) {
    5. return l2;
    6. } else if (l2 == nullptr) {
    7. return l1;
    8. } else if (l1->val < l2->val) {
    9. l1->next = mergeTwoLists(l1->next, l2);
    10. return l1;
    11. } else {
    12. l2->next = mergeTwoLists(l1, l2->next);
    13. return l2;
    14. }
    15. }
    16. };

    递归的思想很重要,但是复杂度会有点高。

  • 相关阅读:
    Docker入门
    【ChatGPT】人工智能的下一个前沿
    英伟达Nvidia论坛
    《MongoDB入门教程》第18篇 文档更新之$unset操作符
    tomcat下载搭建
    Oracle 服务器迁移的一些经验
    OpenMLDB BUG 悬赏令
    使用知行之桥的API端口,提供资源供合作伙伴访问
    Java从入门到架构师__JavaSE
    Android Startup启动优化
  • 原文地址:https://blog.csdn.net/callmejielun/article/details/126255776