21. 合并两个有序链表

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

  示例 1:

    

 

 


    输入:l1 = [1,2,4], l2 = [1,3,4]
    输出:[1,1,2,3,4,4]
  示例 2:

    输入:l1 = [], l2 = []
    输出:[]
===============================================================================

时间复杂度O(n+m),空间复杂度为O(1)

复制代码
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
        ListNode *m = NULL;
        ListNode *p = NULL;
        if (list1 == NULL)
            return list2;
        if (list2 == NULL)
            return list1;
        ListNode *h1;
        ListNode *h2;
        list1->val > list2->val ? h1 = list2 : h1 = list1;
        list1->val > list2->val ? h2 = list1 : h2 = list2;
        
        m = h1;

        while (h1 != NULL) {
            if (h2 != NULL) {
                if (h1->next&&h1->next->val <= h2->val) {
                    h1 = h1->next;
                }
                else {
                    p = h2;
                    h2 = h2->next;
                    p->next = h1->next;
                    h1->next = p;
                    h1 = h1->next;
                }
            }
            else
                break;
        }
        return m;
    }
};
复制代码

看题解,有递归的写法,真的简便,帅气

复制代码
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        if (l1 == nullptr) {
            return l2;
        } else if (l2 == nullptr) {
            return l1;
        } else if (l1->val < l2->val) {
            l1->next = mergeTwoLists(l1->next, l2);
            return l1;
        } else {
            l2->next = mergeTwoLists(l1, l2->next);
            return l2;
        }
    }
};
复制代码

还有迭代的写法,跟我的方法差不多,但是代码更简洁

复制代码
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        ListNode* preHead = new ListNode(-1);

        ListNode* prev = preHead;
        while (l1 != nullptr && l2 != nullptr) {
            if (l1->val < l2->val) {
                prev->next = l1;
                l1 = l1->next;
            } else {
                prev->next = l2;
                l2 = l2->next;
            }
            prev = prev->next;
        }

        prev->next = l1 == nullptr ? l2 : l1;

        return preHead->next;
    }
};
复制代码

最后晒一下我的方法的性能

 

posted on   4小旧  阅读(27)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示