当前位置:网站首页>leetcode21. Merge two ordered linked lists

leetcode21. Merge two ordered linked lists

2022-08-11 05:46:00 FussyCat

leecode题链接:LeetCode21.合并两个有序链表

题目描述:

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

示例 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 均按 非递减顺序 排列

解题思路:
分别使用递归法和迭代法.
以下用C语言实现:

递归法:

struct ListNode* mergeTwoLists(struct ListNode* l1, struct 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;
    }
}

迭代法:

struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
    
    struct ListNode *head = (struct ListNode *)malloc(sizeof(struct ListNode)); /* The chain of distribution header */

    struct ListNode *prev = head;
    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; /* The situation of the first list is empty */
    return head->next;
}
原网站

版权声明
本文为[FussyCat]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/223/202208110512507034.html