题目

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

21. 合并两个有序链表 - 图1

示例 1:

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

示例 2:

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

示例 3:

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

提示:

  1. 两个链表的节点数目范围是 [0, 50]<br /> -100 <= Node.val <= 100<br /> l1 l2 均按 非递减顺序 排列

题解

标答

  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. };

我的

  1. class Solution {
  2. public:
  3. ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
  4. ListNode *result = nullptr;
  5. if (list1 == nullptr&&list2 == nullptr)return result;//都为空
  6. if (list1 == nullptr) return list2;//一为空
  7. if (list2 == nullptr) return list1;//二为空
  8. ListNode *p1 = list1;
  9. ListNode *p2 = list2;
  10. ListNode *go = nullptr;
  11. ListNode *temp = nullptr;
  12. while (p1 != nullptr || p2 != nullptr) {
  13. if (p1 == nullptr) {
  14. temp = p2;
  15. go->next = temp;
  16. go = go->next;
  17. p2 = p2->next; continue;
  18. }
  19. else if(p2 == nullptr) {
  20. temp = p1;
  21. go->next = temp;
  22. go = go->next;
  23. p1 = p1->next; continue;
  24. }
  25. if (p1->val <= p2->val) {
  26. if (go == nullptr) {
  27. go = p1;
  28. result = go;
  29. p1 = p1->next;
  30. continue;
  31. }
  32. else {
  33. temp = p1;
  34. go->next = temp;
  35. go = go->next;
  36. p1 = p1->next;
  37. }
  38. }
  39. else {
  40. if (go == nullptr) {
  41. go = p2;
  42. result = go;
  43. p2 = p2->next;
  44. continue;
  45. }
  46. else {
  47. temp = p2;
  48. go->next = temp;
  49. go = go->next;
  50. p2 = p2->next;
  51. }
  52. }
  53. }
  54. go->next = nullptr;
  55. return result;
  56. }
  57. };