Day7-合并两个有序链表

题目

不知不觉坚持7天了,感觉每天都能学到点东西,很开心~真心希望这个假期过去自己的编程能力能有所进步
今天的题来自leetcode-21,合并两个有序链表:
在这里插入图片描述

题解

题目默认l1,l2是不带头结点的

C++

  1. 迭代法
    这里创建了一个新有序链表l3作为返回值,也可以把l2中的元素插入l1里,返回l1
/**
 * 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) {
        //判空
        if(l1==NULL)
        return l2;
        else if(l2==NULL)
        return l1;

        ListNode* l3=new ListNode(-1);
        ListNode *r=l3;
    
        //从r->next开始的原因:要保留r,要不然头跟着r跑了,拿什么返回?
        while(l1&&l2)
        {
            if(l1->val<=l2->val)
            {
                r->next=l1;
                l1=l1->next;
            }
            else
            {
                r->next=l2;
                l2=l2->next;
            }
            r=r->next;
        }
        //l1,l2剩余的部分直接链在r后面
        while(l1)
        {
            r->next=l1;
            l1=l1->next;
            r=r->next;
        }
        while(l2)
        {
            r->next=l2;
            l2=l2->next;
            r=r->next;
        }
        return l3->next;
    }
};

时间复杂度为O(max(m,n)) (有一年408还考了这个)

  1. 递归法

核心思想:
在这里插入图片描述

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        //判空(可省)
        if(l1==NULL)
        return l2;
        else if(l2==NULL)
        return l1;

        if(l1->val<=l2->val)
        {
            l1->next=mergeTwoLists(l1->next,l2);
            return l1;
        }
        else
        {
            l2->next=mergeTwoLists(l1,l2->next);
            return l2;
        }
    }
};

python

  1. 迭代法
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
        # 判空
        if l1 is None:
            return l2
        elif l2 is None:
            return l1
        
        l3=ListNode(-1)
        r=l3
        while l1 and l2:
            if l1.val<l2.val:
                r.next=l1
                l1=l1.next
            else:
                r.next=l2
                l2=l2.next
            r=r.next
        
        while l1:
            r.next=l1
            l1=l1.next
            r=r.next
        while l2:
            r.next=l2
            l2=l2.next
            r=r.next
            
        return l3.next
        
  1. 递归法
class Solution:
    def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
        if l1 is None:
            return l2
        elif l2 is None:
            return l1
        
        elif l1.val<l2.val:
            l1.next=self.mergeTwoLists(l1.next,l2)
            return l1
        else:
            l2.next=self.mergeTwoLists(l1,l2.next)
            return l2
注意 python和c++区别:
  1. 结构体元素:python中没有"->“符号,都用”."表示
  2. 类中调用:在pyhton类中调用函数要加"self."
  3. 运算符:python中没有小于等于符号"<=",需要用“小于或等于”来表示
  4. 空值:python中空用“None”表示,而不是“NULL”
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值