title: 力扣——21.合并两个有序链表(c语言)
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
1、递归实现:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
if(NULL == l1){
return l2;
}
if(NULL == l2){
return l1;
}
if(l1->val < l2->val){
l1->next = mergeTwoLists(l1->next, l2);
return l1;
} else{
l2->next = mergeTwoLists(l1, l2->next);
return l2;
}
}
复杂度分析:
时间复杂度:O(n+m),其中n和m分别为两个链表的长度。
空间复杂度:O(n+m),其中n和m分别为两个链表的长度。
递归调用 mergeTwoLists 会消耗栈空间。
执行结果:
执行用时:4 ms, 在所有 C 提交中击败了91.93%的用户
内存消耗:5.9 MB, 在所有 C 提交中击败了71.35%的用户
2、迭代实现:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
struct ListNode* result = (struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* prev = result;
while(l1!=NULL && l2!=NULL)
{
if(l1->val < l2->val){
prev->next = l1;
l1 = l1->next;
} else{
prev->next = l2;
l2 = l2->next;
}
prev = prev->next;
}
prev->next = (l1==NULL)?l2:l1;
return result->next;
}
复杂度分析:
时间复杂度:O(n+m),其中n和m分别为两个链表的长度。
空间复杂度:O(1),需要常数的时间存放若干变量。
执行结果:
执行用时:4 ms, 在所有 C 提交中击败了91.93%的用户
内存消耗:6 MB, 在所有 C 提交中击败了50.79%的用户
标签:力扣,ListNode,21,next,链表,l2,l1,struct From: https://www.cnblogs.com/blue-Suri/p/17342933.html