力扣: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 <= 100
l1 和 l2 均按 非递减顺序 排列

来源:力扣(LeetCode)

解题思路

这道题我的思路就是新建一个链表,然后依次比较两个链表的大小,把小的加到新链表当中,知道两个链表有一个遍历结束,所以在最后还要遍历两个链表防止某个链表没有遍历完。类似于归并排序,难度不是很大。

代码实现

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
        ListNode* ans=new ListNode();
        ListNode* head=ans;
        while(list1&&list2)
        {
            if(list1->val<list2->val)
            insert(list1,ans);
            else
            insert(list2,ans);
        }
        while(list1)
        {
            insert(list1,ans);
        }
        while(list2)
        {
            insert(list2,ans);
        }
        return head->next;
    }
    void insert(ListNode* &list,ListNode* &ans)
    {
        ans->next=list;
        ans=ans->next;
        list=list->next;
    }
};

然后看了一些题解,发现可以用递归方法,而且代码非常简洁,不得不说递归真是个不错的方法

代码实现

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        if (l1 == NULL) {
            return l2;
        }
        if (l2 == NULL) {
            return l1;
        }
        if (l1->val <= l2->val) {
            l1->next = mergeTwoLists(l1->next, l2);
            return l1;
        }
        l2->next = mergeTwoLists(l1, l2->next);
        return l2;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_52905520/article/details/126650083
今日推荐