LeetCode题解(Week2):21. Merge Two Sorted Lists

原题目

Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.

中文大意

对两个有序的链表进行合并,返回一个新的链表。这个新的链表应该是能够通过旧链表节点的重新连接而产生的。


题解

/**
 * 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* merge = new ListNode(-1);
        ListNode* ans = merge;
        //每次找到两个链表当前节点中较小的一个,加到merge链表中
        while(l1!=NULL&&l2!=NULL)
        {
            if(l1->val > l2->val)
            {
                ListNode* currNode = new ListNode(l2->val);
                merge ->next = currNode;
                merge = merge->next;
                l2 = l2->next;
            }
            else
            {
                ListNode* currNode = new ListNode(l1->val);
                merge ->next = currNode;
                merge = merge->next;
                l1 = l1->next;
            }
        }
        //处理两个链表长度不一致的情况
        while(l1!=NULL)
        {
            ListNode* currNode = new ListNode(l1->val);
            merge ->next = currNode;
            merge = merge->next;
            l1 = l1->next;
        } 
        while(l2!=NULL)
        {
            ListNode* currNode = new ListNode(l2->val);
            merge ->next = currNode;
            merge = merge->next;
            l2 = l2->next;            
        }
        ListNode* temp = ans;
        ans = ans->next;
        delete temp; //防止内存碎片产生
        return ans;
    }
};

思路

  • 我做这道题的目的是为链表归并排序做铺垫,也是对数据结构基础的复习。实质上,无论要合并的两个链表是否已经有序,不妨碍这个算法本身的执行,以为都是直接遍历两个链表然后取出较小的一个插入到新的链表当中,无需新建节点。因此,算法的时间复杂度为O(n+m),空间复杂度为O(1)
  • 在实现的过程中还要注意一点是两个链表不等长的时候,需要对单个的链表再进行处理,这个时候必然有一个链表为空,只要将非空链表的剩余节点,加到新链表的末尾就行了
  • 此外,要注意的是,在合并两个链表的时候,我新建了一个节点,作为链表的头部。但当归并的过程结束以后,需要将这个头部删除,防止内存碎片的产生
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值