当前位置:   article > 正文

3/7—21. 合并两个有序链表

3/7—21. 合并两个有序链表

代码实现:

方法1:递归  ---->难点

  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * struct ListNode *next;
  6. * };
  7. */
  8. struct ListNode* mergeTwoLists(struct ListNode *list1, struct ListNode *list2) {
  9. /*
  10. 1.如果l1为空,返回l2
  11. 2.如果l2为空,返回l1
  12. 3.如果l1的值小于l2,比较l1的next值和l2,并把值赋给l1的下一个;返回l1
  13. 4.反之,比较l1和l2的next值,并把值赋给l2的下一个;返回l2
  14. */
  15. if (list1 == NULL) {
  16. return list2;
  17. } else if (list2 == NULL) {
  18. return list1;
  19. }
  20. if (list1->val < list2->val) {
  21. list1->next = mergeTwoLists(list1->next, list2);
  22. return list1;
  23. } else {
  24. list2->next = mergeTwoLists(list1, list2->next);
  25. return list2;
  26. }
  27. }

方法2:常规解法+设置虚拟头结点                                                                           

  1. /**
  2. * Definition for singly-linked list.
  3. * struct ListNode {
  4. * int val;
  5. * struct ListNode *next;
  6. * };
  7. */
  8. struct ListNode* mergeTwoLists(struct ListNode *list1, struct ListNode *list2) {
  9. if (list1 == NULL) {
  10. return list2;
  11. }
  12. if (list2 == NULL) {
  13. return list1;
  14. }
  15. struct ListNode *head = malloc(sizeof(*head)); // 设置虚拟头结点
  16. struct ListNode *h = head;
  17. while (list1 && list2) {
  18. if (list1->val < list2->val) {
  19. h->next = list1;
  20. list1 = list1->next;
  21. } else {
  22. h->next = list2;
  23. list2 = list2->next;
  24. }
  25. h = h->next;
  26. h->next = NULL;
  27. }
  28. if (list1) {
  29. h->next = list1;
  30. }
  31. if (list2) {
  32. h->next = list2;
  33. }
  34. struct ListNode *result = head->next;
  35. head->next = NULL;
  36. free(head);
  37. return result;
  38. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/215652?site
推荐阅读
相关标签
  

闽ICP备14008679号