LeetCode(21):合并两个有序链表

Easy!

题目描述:

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

示例:

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

解题思路:

具体思想就是新建一个链表,然后比较两个链表中的元素值,把较小的那个链到新链表中,由于两个输入链表的长度可能不同,所以最终会有一个链表先完成插入所有元素,则直接将另一个未完成的链表直接链入新链表的末尾。代码如下:

C++解法一:

复制代码
 1 class Solution {
 2 public:
 3     ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
 4         ListNode *dummy = new ListNode(-1), *cur = dummy;
 5         while (l1 && l2) {
 6             if (l1->val < l2->val) {
 7                 cur->next = l1;
 8                 l1 = l1->next;
 9             } else {
10                 cur->next = l2;
11                 l2 = l2->next;
12             }
13             cur = cur->next;
14         }
15         cur->next = l1 ? l1 : l2;
16         return dummy->next;
17     }
18 };
复制代码

下面我们来看递归的写法,当某个链表为空了,就返回另一个。然后核心还是比较当前两个节点值大小,如果l1的小,那么对于l1的下一个节点和l2调用递归函数,将返回值赋值给l1.next,然后返回l1;否则就对于l2的下一个节点和l1调用递归函数,将返回值赋值给l2.next,然后返回l2,参见代码如下:

C++解法二:

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

下面这种递归的写法去掉了if从句,看起来更加简洁一些,但是思路并没有什么不同:

C++解法三:

复制代码
 1 class Solution {
 2 public:
 3     ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
 4         if (!l1) return l2;
 5         if (!l2) return l1;
 6         ListNode *head = l1->val < l2->val ? l1 : l2;
 7         ListNode *nonhead = l1->val < l2->val ? l2 : l1;
 8         head->next = mergeTwoLists(head->next, nonhead);
 9         return head;
10     }
11 };
复制代码

还可以三行搞定,简直丧心病狂有木有!

C++解法四:

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

 

posted @   Ariel_一只猫的旅行  阅读(2705)  评论(1编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示