题目
不知不觉坚持7天了,感觉每天都能学到点东西,很开心~真心希望这个假期过去自己的编程能力能有所进步
今天的题来自leetcode-21,合并两个有序链表:
题解
题目默认l1,l2是不带头结点的
C++
- 迭代法
这里创建了一个新有序链表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还考了这个)
- 递归法
核心思想:
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
- 迭代法
# 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
- 递归法
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++区别:
- 结构体元素:python中没有"->“符号,都用”."表示
- 类中调用:在pyhton类中调用函数要加"self."
- 运算符:python中没有小于等于符号"<=",需要用“小于或等于”来表示
- 空值:python中空用“None”表示,而不是“NULL”