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; } };
最后晒一下我的方法的性能
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理