LeetCode-21——合并两个有序链表

合并两个有序链表(简单)

题目要求

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

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

一个小菜鸡的菜鸡 c++ 解法,执行用时 16ms,内存消耗 9MB,还会继续探索更优化的方法和 java 语言的解法!

C++递归解法

​ 下面是题目给出的 C++ 链表定义

1
2
3
4
5
6
7
8
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/

思路

​ 根据给出的题干要求,想到用递归的方法,逐个同时检测链表 l1 和 l2 中每一个数据值的大小,通过判断大小后对链表的重新排序,来得到合并后的有序链表

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if(l1 == NULL)
return l2;
else if (l2 == NULL)
return l1;
else if (l1->val < l2->val) {
l1->next = mergeTwoLists(l1->next, l2);
return l1;
}
else {
l2->next = mergeTwoLists(l1, l2->next);
return l2;
}
}
};

解释

​ 先分别判断两个链表是否为空,如果有一个链表为空,直接返回另一个链表就可以了。接着就到了关键的递归环节,这里对于刚传进来的 l1 和 l2 来说,都代表两个链表的第一个节点,保留含有较小的值得节点,再对该节点的 next 节点和另一个链表使用 mergeTwoLists() 函数,这样,函数就会通过不断地递归,来检测出两个链表的剩余节点中值较小的那个,最后在当一个链表已经被取空之后,函数的递归调用就会停止,从而将两个有序链表合并为一个有序链表

-------------本文结束感谢您的阅读-------------