Leetcode-21: 合并两个有序链表(逐行注释)

题目链接

https://leetcode-cn.com/problems/merge-two-sorted-lists/

题目

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

示例

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

思路

我们以l1为基础,将l2合并到l1当中。

首先为了方便操作(对于l2头结点小于l1头结点的情况),在l1前面先添加一个虚拟头结点,方便在原本的l1头结点前添加结点,最后输出时删除该虚拟头结点即可。

对于l1中的当前指向的结点和l2中当前指向的结点,如果l2结点的值<l1结点的值,则将该l2结点加入到l1结点之前。具体见代码注释

C++ Code

/**
 * 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) {
        ListNode* vir = new ListNode(-101, l1); ///在l1前添加虚拟头结点方便处理
        ListNode* cur1=vir; //cur1指向l1当前遍历的结点
        ListNode* cur2=l2;  //cur2指向l2当前遍历的结点
        ListNode* temp1=cur1; //temp1用于保存cur1的前一结点,初始时和cur1在同一位置
        while(cur1!=NULL&&cur2!=NULL) //当cur1和cur2均不为末端结点
        {
            //cur1当前指向结点的值≥cur2当前指向结点的值 将cur2结点插入到cur1之前
            if(cur1->val >= cur2->val) 
            {
                ListNode* temp2=cur2->next; //先用temp保存cur2指向的下一结点 才能对cur2操作 
                cur2->next=cur1; //将cur2插入到cur1之前
                temp1->next=cur2; //连接cur2前面的部分
                cur2=temp2;       //更新当前cur2 重新指向l2 指向移动前的下一结点
                temp1=temp1->next; //更新temp1为cur1的前一结点
            }
            //cur1当前指向结点的小于cur2当前指向结点的值 cur1往后移
            else 
            {   temp1=cur1;
                cur1=cur1->next;
            }
        }
        //if(cur2==NULL) return vir->next;
        if(cur1==NULL) //cur1已经走到了末尾,也就是l1已经遍历完了,将l2剩余的元素添加到l1后面
        {
            temp1->next=cur2; 
        }
        return vir->next; //最开始添加的虚拟头结点要删除
    }
};

结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值