题目:

21. 合并两个有序链表

将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

解题思路:

1.合并就是改变表的next的指针,根据升序将两个升序表重新链接即可;
2.最后返回初始地址的指针就可以了。

代码:

  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * ListNode *next;
  6. * ListNode(int x) : val(x), next(NULL) {}
  7. * };
  8. */
  9. class Solution {
  10. public:
  11. ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
  12. //new_one实时指针,first指向新链表的初始地址
  13. ListNode* new_one = NULL;
  14. ListNode* first = NULL;
  15. //检测空指针
  16. if(l1 == NULL){
  17. return l2;
  18. }
  19. if(l2 == NULL){
  20. return l1;
  21. }
  22. //首地址传值,与后面的使用new_one->next不同
  23. //确定first
  24. if(l1->val < l2->val){
  25. new_one = l1;
  26. l1 = l1->next;
  27. }
  28. else{
  29. new_one = l2;
  30. l2 = l2->next;
  31. }
  32. first = new_one;
  33. //链表重新链接
  34. for(;l1 != NULL && l2 != NULL;){
  35. if(l1->val < l2->val){
  36. new_one->next = l1;
  37. new_one = new_one->next;
  38. l1 = l1->next;
  39. }
  40. else{
  41. new_one->next = l2;
  42. new_one = new_one->next;
  43. l2 = l2->next;
  44. }
  45. }
  46. //末尾处理
  47. if(l1 == NULL){
  48. new_one->next = l2;
  49. }
  50. else{
  51. new_one->next = l1;
  52. }
  53. return first;
  54. }
  55. };

思考:

1.指针使用前必须进行检测是否为空指针;

出现如下报错:Line 17: Char 16: runtime error: member access within null pointer of type ‘ListNode’ (solution.cpp)
错误原因:试图使用空指针
image.png这个原先没有加。
**

2.0ms代码:

  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * ListNode *next;
  6. * ListNode(int x) : val(x), next(NULL) {}
  7. * };
  8. */
  9. // 迭代的方法很有意思
  10. class Solution {
  11. public:
  12. ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
  13. if (l1 == NULL) return l2;
  14. else if (l2 == NULL) return l1;
  15. else if (l1->val < l2->val) {
  16. l1->next = mergeTwoLists(l1->next, l2);
  17. return l1;
  18. } else {
  19. l2->next = mergeTwoLists(l1, l2->next);
  20. return l2;
  21. }
  22. }
  23. };

3.上述代码的改进在于使用函数递归方式来完成,不用记录初始指针,不用对首尾情况进行分别讨论。