# 合并两个有序链表

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

 

示例 1:

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

示例 2:

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

示例 3:

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

 

提示:

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

 

示例 1:

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

示例 2:

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

示例 3:

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

 

提示:

以下错误的选项是?

## aop ### before ```cpp #include using namespace std; struct ListNode { int val; struct ListNode *next; ListNode() : val(0), next(nullptr){}; ListNode(int x) : val(x), next(nullptr){}; ListNode(int x, ListNode *next) : val(x), next(next){}; }; ``` ### after ```cpp int main() { Solution sol; ListNode *L1 = new ListNode; ListNode *l11 = new ListNode(1); ListNode *l12 = new ListNode(2); ListNode *l13 = new ListNode(4); L1->next = l11; l11->next = l12; l12->next = l13; ListNode *L2 = new ListNode; ListNode *l21 = new ListNode(1); ListNode *l22 = new ListNode(3); ListNode *l23 = new ListNode(4); L2->next = l21; l21->next = l22; l22->next = l23; ListNode *ret = new ListNode; ret = sol.mergeTwoLists(L1, L2); ListNode *p = ret->next; while (p != NULL) { cout << p->val << " "; p = p->next; } return 0; } ``` ## 答案 ```cpp class Solution { public: ListNode *mergeTwoLists(ListNode *l1, ListNode *l2) { if (l1 == NULL) return l2; else if (l2 == NULL) 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; } } }; ``` ## 选项 ### A ```cpp class Solution { public: ListNode *mergeTwoLists(ListNode *l1, ListNode *l2) { l2 = l2->next; ListNode *h = new ListNode(0); ListNode *head = h; while (l1 && l2) { if (l1->val < l2->val) { h->next = new ListNode(l1->val); h = h->next; l1 = l1->next; } else { h->next = new ListNode(l2->val); h = h->next; l2 = l2->next; } } if (l1) { while (l1) { h->next = new ListNode(l1->val); h = h->next; l1 = l1->next; } } else if (l2) { while (l2) { h->next = new ListNode(l2->val); h = h->next; l2 = l2->next; } } ListNode *ptrDelete = head; head = head->next; delete ptrDelete; return head; } }; ``` ### B ```cpp class Solution { public: ListNode *mergeTwoLists(ListNode *l1, ListNode *l2) { if (NULL == l1) return l2; if (NULL == l2) return l1; l1 = l1->next; ListNode *p1 = l1; ListNode *p2 = l2; ListNode *head = new ListNode(-1); ListNode *curNode = head; while (NULL != p1 && NULL != p2) { if (p1->val < p2->val) { curNode->next = p1; curNode = p1; p1 = p1->next; } else { curNode->next = p2; curNode = p2; p2 = p2->next; } } if (NULL != p1) curNode->next = p1; if (NULL != p2) curNode->next = p2; return head->next; } }; ``` ### C ```cpp class Solution { public: ListNode *mergeTwoLists(ListNode *l1, ListNode *l2) { vector vec; l1 = l1->next; while (l1 != NULL) { vec.push_back(l1->val); l1 = l1->next; } while (l2 != NULL) { vec.push_back(l2->val); l2 = l2->next; } sort(vec.begin(), vec.end()); auto head = new ListNode; auto cur = head; for (const auto &c : vec) { auto p = new ListNode(c); cur->next = p; cur = p; } return head->next; } }; ```