题目描述
21. 合并两个有序链表
难度简单2922收藏分享切换为英文接收动态反馈
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 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 <= 100
l1 和 l2 均按 非递减顺序 排列
刚接触这道题时 我根本就没想到要用递归 看了一下其他人的解法 感觉递归还不错 分享给你们
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
//我做为刚入门的新手 我来分享一下这道题的解题思路 (参考他人 如有不对望指教)
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{
//最终比较完之后肯定有一个为空
if(list1 == NULL)
{
return list2;//将非空的返回
}
if(list2 == NULL)
{
return list1;
}
//如何调用
if(list1->val < list2->val)
{
//小的节点 指向下一个 较小的节点
list1->next = mergeTwoLists(list1->next,list2);
return list1;//不知道两个链表第一个节点谁小 如果list1小返回list1的地址
}
else
{
list2->next = mergeTwoLists(list2->next,list1);
return list2;
}
}
思路:首先确定两个链表中首个节点那个小 再调用该函数去判断该节点的下一个节点与另外一条链表的节点的大小关系 返回小的节点地址 (调用与返回 在一个层面只不过 不是同时进行 需要你了解一下递归的思路) 如此反复就将两个链表合并了
对于刚开始判断链表为空 应该放在最前面 不然链表为空 接下来的代码中可能会越界访问
题目来源于leetcode21题解
希望你能从中受益~