21. 合并两个有序链表【 力扣(LeetCode) 】

一、题目描述

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

二、测试用例

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

三、解题思路

  1. 基本思路:
      正常的合并排序,注意结点的拼接和空链表的情况即可
  2. 具体思路:
    • 定义:指针 l1 ,l2 用于遍历两个链表;指针 ans 用于存放答案;指针 head 用于遍历答案;
    • 合并排序:遍历两个链表,
      • 如果 l1 的值小于 l2 :表示要存的结点是 l1 ,将 l1 存到 head 的下一个结点中,l1 后移;
      • 如果 l1 的值大于等于 l2 :表示要存的结点是 q ,表示要存的结点是 l2 ,将 l2 存到 head 的下一个结点中,l2 后移;
      • head 后移
    • 将最后剩余的非空链表拼接到 head 的下一个结点中。
    • 释放头指针的空间并返回结果 ans 。【头结点表示头指针,不存入任何值,而结果不要头指针】

四、参考代码

时间复杂度: O ( n ) \Omicron(n) O(n)
空间复杂度: O ( 1 ) \Omicron(1) O(1)

/**
 * 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(),*head=ans,*l1=list1,*l2=list2;

        while(l1!=nullptr&&l2!=nullptr){
            if(l1->val<l2->val){
                head->next=l1;
                l1=l1->next;
            }else{
                head->next=l2;
                l2=l2->next;
            }
            head=head->next;
        }
        head->next=(l1!=nullptr)?l1:l2;
        head=ans;
        ans=ans->next;
        delete head;

        return ans;
    }
};

你可能感兴趣的:(链表,leetcode,数据结构,算法,c++)