高频面试题之链表专题-合并两个有序单链表,要求合并后依旧有序

1、合并两个有序单链表,要求合并后依旧有序。高频面试题之链表专题-合并两个有序单链表,要求合并后依旧有序_第1张图片

OJ链接:https://leetcode-cn.com/problems/merge-two-sorted-lists/description/

高频考察的大厂云图:

高频面试题之链表专题-合并两个有序单链表,要求合并后依旧有序_第2张图片

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

示例 1:

高频面试题之链表专题-合并两个有序单链表,要求合并后依旧有序_第3张图片

输入: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;
 *     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* l1, ListNode* l2) {

    }
};

解题思路

取小的尾插

先创建一个空链表头节点,然后依次从两个有序链表中选取最小的进行尾插操作进行合并。

高频面试题之链表专题-合并两个有序单链表,要求合并后依旧有序_第4张图片

尾插小技巧:一般要整出一个头结点,为了防止第一次与第二次及以后的尾插不同

代码实现:

/**
 * 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* l1, ListNode* l2) {
        if(l1==NULL)
            return l2;
        if(l2==NULL)
            return l1;
        ListNode* head, * tail;
        head = tail = new ListNode;

        //取小的尾插
        while (l1 && l2)
        {
            if (l1->val < l2->val)
            {
                tail->next = l1;
                l1= l1->next;
            }
            else if(l1->val>l2->val)
            {
                tail->next = l2;
                l2 = l2->next;
            }
            else
            {
                tail->next = l1;
                l1= l1->next;
                tail = tail->next;
                tail->next = l2;
                l2 = l2->next;
            }
            tail = tail->next;
        }
        if (l1 != NULL)
            tail->next = l1;
        else if (l2 != NULL)
            tail->next = l2;

        //释放防止内存泄露
        ListNode* l = head->next;
        delete head;
        return l;
    }
};

 

 

 

 

你可能感兴趣的:(数据结构与算法)