题目内容:将两个升序链表合并为一个升序链表并返回
例:
输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4]
输入:l1 = [], l2 = [0] 输出:[0]
- 一开始的想法:将list1里的每一个节点value和list2做对比,遍历,然后插入合适的位置,但发现流程复杂,还要考虑排序算法。于是看了题解
- 官方题解上来就给我来了个递归,初看似乎很难理解的样子,但我却发现代码只有短短几行:
/** * 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; } else if(!list2) { return list1; } else if(list1->val<list2->val) { list1->next = mergeTwoLists(list1->next, list2); return list1; } else { list2->next = mergeTwoLists(list1, list2->next); return list2; } } };
前面两句还好,如果1空,那么返回2,如果2空,那么返回1;精髓在于递归。
-
关键在于递归,通过比较l1和l2结点的大小,将函数递归,赋值给连接的next从而避免了麻烦的for循环,函数自己直接进行了大小的排序和合并。