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