uacs2024

导航

leetcode21-合并两个有序链表

21. 合并两个有序链表

 

方法一:递归

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
        if(!list1)  return list2;
        if(!list2)  return list1;
        if(list1->val<=list2->val)
        {
            list1->next=mergeTwoLists(list1->next,list2);
            return list1;
        }
        list2->next=mergeTwoLists(list2->next,list1);
        return list2;
    }
};

评论区一位大佬的讲解:

关于return L1的个人理解: 递归的核心在于,我只关注我这一层要干什么,返回什么,至于我的下一层(规模减1),我不管,我就是甩手掌柜.

好,现在我要merge L1,L2.我要怎么做?

  • 显然,如果L1空或L2空,我直接返回L1或L2就行,这很好理解.
  • 如果L1第一个元素小于L2的? 那我得把L1的这个元素放到最前面,至于后面的那串长啥样 ,我不管. 我只要接过下级员工干完活后给我的包裹, 然后把我干的活附上去(令L1->next = 这个包裹)就行
  • 这个包裹是下级员工干的活,即merge(L1->next, L2)

我该返回啥?

  • 现在不管我的下一层干了什么,又返回了什么给我, 我只要知道,假设我的工具人们都完成了任务, 那我的任务也就完成了,可以返回最终结果了
  • 最终结果就是我一开始接手的L1头结点+下级员工给我的大包裹,要一并交上去, 这样我的boss才能根据我给它的L1头节点往下找,检查我完成的工作

 方法二:迭代法

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
        if(!list1)  return list2;
        if(!list2)  return list1;
        ListNode *res=new ListNode;
        ListNode *p=res;
        while(list1&&list2)
        {
            if(list1->val<list2->val)
            {
                p->next=list1;
                list1=list1->next;
            }
            else
            {
                p->next=list2;
                list2=list2->next;
            }
            p=p->next;
        }
        p->next=list2?list2:list1;
        return res->next;
    }
};

反思了一下,一开始想的就是迭代法。这道题做不出的原因是不懂得一步步地寻找要连接的结点,想着保存各种变量然后连接一连串的结点,结果这样反而还把问题搞复杂了。

posted on 2022-09-17 18:25  ᶜʸᵃⁿ  阅读(14)  评论(0编辑  收藏  举报