力扣21. 合并两个有序链表

简介: 力扣21. 合并两个有序链表

力扣21. 合并两个有序链表

一、题目描述:

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

示例 1:

输入:l1 = [1,2,4], l2 = [1,3,4]输出:[1,1,2,3,4,4]示例 2:

输入:l1 = [], l2 = []输出:[]示例 3:

输入:l1 = [], l2 = [0]输出:[0]

提示:

两个链表的节点数目范围是 [0, 50]-100 <= Node.val <= 100l1 和 l2 均按 非递减顺序 排列

二、思路分析:

这道题考察了什么思想?你的思路是什么?

  1. 这道题目是链表的基础操作,合并两个有序的链表。我的思路是使用递归来完成合并。
    因为 list1 = mergeTwoLists(list1, list2)所以可以有mergeTwoLists(list1->next, list2)。

做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?

  1. 这道题目只要理清思路,还是比较容易的。需要注意不要太粗心哦。需要注意如果链表一开始是空链表,就得直接返回非空链表即可,不需要做任何操作。

有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?

  1. 但是使用递归需要耗费很大的空间,空间复杂度就高一点。
    还有一种思路:

三、AC 代码:

/**

* Definition for singly-linked list.

* struct ListNode {

*     int val;

*     struct ListNode *next;

* };

*/

 

 

structListNode*mergeTwoLists(structListNode*list1, structListNode*list2)

{

   if(list1==NULL)

       returnlist2;

   elseif(list2==NULL)

       returnlist1;

   elseif(list1->val<list2->val)

   {

       list1->next=mergeTwoLists(list1->next, list2);

       returnlist1;

   }

   else

   {

       list2->next=mergeTwoLists(list1, list2->next);

       returnlist2;

   }

}

 

/**

* Definition for singly-linked list.

* struct ListNode {

*     int val;

*     struct ListNode *next;

* };

*/

 

 

structListNode*mergeTwoLists(structListNode*list1, structListNode*list2)

{

   structListNode*h,*p;

   h=(structListNode*)malloc(sizeof(structListNode));

   p=h;

   while(list1&&list2)

   {

       if(list1->val<=list2->val)

       {

           h->next=list1;

           list1=list1->next;

       }

       else

       {

           h->next=list2;

           list2=list2->next;

       }

       h=h->next;

   }

   h->next=list1?list1:list2;

   returnp->next;

}

 

 

四、总结:

链表的基本操作得掌握!

目录
相关文章
|
1月前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
35 1
|
1月前
Leetcode第21题(合并两个有序链表)
这篇文章介绍了如何使用非递归和递归方法解决LeetCode第21题,即合并两个有序链表的问题。
48 0
Leetcode第21题(合并两个有序链表)
|
1月前
|
存储 算法
【❤️算法笔记❤️】-每日一刷-21、合并两个有序链表
【❤️算法笔记❤️】-每日一刷-21、合并两个有序链表
93 0
|
1月前
|
算法
【链表】算法题(二) ----- 力扣/牛客
【链表】算法题(二) ----- 力扣/牛客
|
1月前
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
18 0
LeetCode第二十四题(两两交换链表中的节点)
|
1月前
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第19题要求删除链表的倒数第N个节点,可以通过快慢指针法在一次遍历中实现。
44 0
Leetcode第十九题(删除链表的倒数第N个节点)
|
1月前
|
索引
力扣(LeetCode)数据结构练习题(3)------链表
力扣(LeetCode)数据结构练习题(3)------链表
78 0
|
1月前
【LeetCode 10】142. 环形链表 II
【LeetCode 10】142. 环形链表 II
21 0
|
1月前
【LeetCode 09】19 删除链表的倒数第 N 个结点
【LeetCode 09】19 删除链表的倒数第 N 个结点
17 0
|
1月前
【LeetCode 08】206 反转链表
【LeetCode 08】206 反转链表
12 0