leetcode 21. 合并两个有序链表(C++)

墨蓝 2023-07-12 03:36 53阅读 0赞

p.s python版——>leetcode 21:合并两个有序链表

题目

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

示例:

  1. 输入:1->2->4, 1->3->4
  2. 输出:1->1->2->3->4->4

来源:21. 合并两个有序链表 - 力扣(LeetCode)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

比较插入法

  • 定义两个指针分别指向两个链表,比较两个指针所指向的值,选取值小的节点直接加入新链表,并将其指针向后移动
    (直接把节点接上去,而不是用值建立新节点)

代码如下:

  1. class Solution {
  2. public:
  3. ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
  4. if (!l1)
  5. return l2;
  6. if (!l2)
  7. return l1;
  8. ListNode* ihead = new ListNode(0);
  9. ListNode* node = ihead;
  10. while (l1 && l2)
  11. {
  12. if (l1->val > l2->val) swap(l1, l2);
  13. node->next = l1;
  14. node = node->next;
  15. l1 = l1->next;
  16. }
  17. node->next = l1 ? l1 : l2;
  18. return ihead->next;
  19. }
  20. };

结果:
在这里插入图片描述

递归法

  • 递归比较两个链表头节点的值
    使小的那个为l1(若反了,则交换顺序)
    然后l1的下一个节点为mergeTwoLists(l1.next, l2)的返回值

代码如下:

  1. class Solution {
  2. public:
  3. ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
  4. if (l1 && l2)
  5. {
  6. if(l1->val > l2->val) swap(l1,l2);
  7. l1->next = mergeTwoLists(l1->next, l2);
  8. }
  9. return l1 ? l1 : l2;
  10. }
  11. };

结果:
在这里插入图片描述

相关测试用函数

  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4. struct ListNode {
  5. int val;
  6. ListNode *next;
  7. ListNode(int x) : val(x), next(NULL) { }
  8. };
  9. ListNode* ListNodeInit(vector<int> a){ //用vector初始化链表
  10. ListNode* ihead = new ListNode(0);
  11. ListNode* node = ihead;
  12. for(auto p = a.begin();p != a.end();p++)
  13. {
  14. node->next = new ListNode(*p);
  15. node = node->next;
  16. }
  17. return ihead->next;
  18. };
  19. void ListNodePrint(ListNode* l){ //打印链表
  20. while(l)
  21. {
  22. cout<<"-"<<l->val;
  23. l = l->next;
  24. }
  25. cout<<endl;
  26. };
  27. int main(){
  28. vector<int> nums1{ 1,3,4};
  29. vector<int> nums2{ 1,2,4};
  30. ListNode* l1 = ListNodeInit(nums1);
  31. ListNode* l2 = ListNodeInit(nums2);
  32. Solution so;
  33. ListNode* ans = so.mergeTwoLists(l1,l2);
  34. ListNodePrint(ans);
  35. }

发表评论

表情:
评论列表 (有 0 条评论,53人围观)

还没有评论,来说两句吧...

相关阅读