LeetCode No.21 合并两个有序链表

LeetCode No.21 合并两个有序链表

Problem

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

示例:

输入输出
1->2->4, 1->3->41->1->2->3->4->4

Solving

考虑用一个新的链表 l 来记录合并后的链表,用节点 t 记录链表的合并过程,节点 t 的初始化与节点 l 指向同一内存空间;当链表 l1 和 l2 非空时,依次按顺序遍历两个链表的节点值,较小的节点则连接在 t 节点的后面,直至任意一个链表为空。

此处节点 t 不断后移记录合并过程时节点 l 并不会随之后移,原因是初始化时节点 t 与节点 l 指向同一内存空间,当链表中的最小节点首次连接在节点 t 的后面时,也就同时连接在了节点 l 的后面,当节点 t 发生后移时,节点 l 仍然指向该内存空间并没有发生任何改变 。

注意:

  1. 当链表 l1 或 l2 为空时,直接将另外一个链表连接至节点 t 的后面即可;
  2. 此处用 new 函数为链表 l 动态申请了空间,因此在不再使用 l 时应释放申请的内存空间,否则会造成内存泄漏;并且要在在返回合并链表前进行内存释放,因为 return 语句代表当前函数的结束,其后的语句将不会执行,因此需要在内存释放前将合并后的结果链表保存一下。

Code(C++)

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        ListNode* l = new ListNode(0);  //用new动态分配内存来存储合并的链表,val初始值为0;
        ListNode* t = l;      //节点t和节点l指向同一内存空间,节点t用来记录链表的合并过程;
        while(l1 != NULL && l2 != NULL){  //分别比较两个链表的每一位数值,将小数值的节点接在l的后面;
            if(l1 -> val <= l2 -> val){  
                t -> next = l1;   //满足条件将l1接在t节点的后面;
                t = t -> next;    //t移动到后一个节点的位置;
                l1 = l1 -> next;  //l1移动到后一个节点的位置;
            }
            else{
                t -> next = l2;  //满足条件将l2接在t节点的后面;
                t = t -> next;
                l2 = l2 -> next;
            }
        }
        if(l1 == NULL){     //当l1或者l2中有一个为空时将非空的链表接在节点t的后面;
            t -> next = l2;
        }
        else{
            t -> next = l1;
        }
        ListNode* mergedList = l -> next;  //l节点后面的链表即为合并的结果链表,用mergedList记录;
        delete l;     //释放申请的内存空间;
        return mergedList;
    }
};

执行用时:8 ms
内存消耗:8.1 MB

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值