Leetcode合并两个有序链表算法与分析

@Leetcode合并两个有序链表

想必每一个接触过链表这种数据结构的coder都会对链表的合并有所了解,而两个有序链表的合并则是其中较为简单的一部分,不多说,来看题干:

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

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

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */

上面的代码是题目给出的这段链表的基本信息,之后的很多题目中都会在编写之前给出这些信息,我就不再单独写出来了。可以看出这是两个很基本的单链表,只有一个val表示值和指向后继结点的指针,所以解决这个问题,我们也不需要使用很复杂的思路,当然,大佬们总是有有意思的各种思路的解法,在这里我分享其中两种比较简单的思路,分别是非递归的迭代思路和递归形式的思路:

首先是非递归的思路:
代码如下:

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        ListNode* head=new ListNode(-1);
        ListNode* l3=head;
        while(l1!=NULL&&l2!=NULL)
        {
            if(l1->val<l2->val)
            {
                 l3->next=l1;
                 l1=l1->next;
                 l3=l3->next;
            }
            else if(l2->val<=l1->val)
            {
                 l3->next=l2;
                 l2=l2->next;
                 l3=l3->next;
            }
        }
        while((l1==NULL&&l2!=NULL)||(l1!=NULL&&l2==NULL))
        {
        if(l1==NULL)
        while(l2!=NULL)
        {
            l3->next=l2;
            l2=l2->next;
            l3=l3->next;
        }
        else if(l2==NULL)
        while(l1!=NULL)
        {
            l3->next=l1;
            l1=l1->next;
            l3=l3->next;
        } 
        }       
        return head->next;
    }
};

在这里插入图片描述
这段代码写的真是史诗级的啰嗦啊,最后20行的比较写的甚是复杂,后来发现只需要一句话就可以搞定:

l3->next = l1 != NULL ? l1 : l2;

话虽如此,但这种迭代交换的思想就是如此,这是使用开辟新的链表的方法的典型做法,通过比较每个链表结点的大小来决定谁插入l3,当然也有不用开辟新的链表的做法,但共同之处是都需要建立一个新的头结点来表示存储最后结果的链表,这是为了返回而考虑的,定义语句如下:

 ListNode* head=new ListNode(-1);
 ListNode* l3=head;

需要注意的是,最后返回一定是head->next,因为我们是从l3->next开始加链表结点的,当然你也可以把这些next都去掉试一试,但能不能成功通过我就不敢保证了哈。

除了迭代方法,递归方法也不失为一种便利快捷思路简单的方法,代码转载自大佬:abigcat
链接:https://leetcode-cn.com/problems/two-sum/solution/he-bing-liang-ge-you-xu-lian-biao-guan-fang-cban-b/

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        if(l1 == NULL) return l2;
        else if (l2 == NULL) return l1;
        else if (l1->val < l2->val) {
            l1->next = mergeTwoLists(l1->next, l2);
            return l1;
        } else {
            l2->next = mergeTwoLists(l1, l2->next);
            return l2;
        }
    }
};

递归与迭代的思路是相同的,只是返回出口放在了最前面这一点不太相同,当然,递归就不再需要开辟新链表了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值