本系列为本人leetcode刷题之路2.0,将相关思考记录在此博客。欢迎批评指正。每个代码块都有需要注意的问题点总结。
题目理解
解题思路
①迭代法
②递归法
递归和迭代经常互换。
解法一 迭代法
时间复杂度为O(n), 空间复杂度为O(n)
python
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
cur = ListNode()
l3 = cur
while (l1 and l2):
if l1.val < l2.val:
l3.next = ListNode(l1.val)
l3 = l3.next
l1 = l1.next
else:
l3.next = ListNode(l2.val)
l3 = l3.next
l2 = l2.next
if (l1!=None): # !l1,要注意
l3.next = l1
if (l2!=None): # !l2,见我另一篇针对运算符的博客
l3.next = l2
return cur.next
总结:见代码中注释。常用写法见下面这种
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
res = ListNode()
cur = res
while (l1 and l2):
if l1.val < l2.val:
cur.next = l1
l1 = l1.next
else:
cur.next = l2
l2 = l2.next
cur = cur.next
cur.next = l1 or l2 # 如果想保险起见,利用if分别判断两次也可以
return res.next
java
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode res =new ListNode(); //注意java的命名
ListNode cur = res;
while ((l1 != null) && (l2 != null)) { //逻辑运算符||怎么了,还有注意none和null
if (l1.val <= l2.val) {
cur.next = l1;
l1 = l1.next;
}
else {
cur.next = l2;
l2 = l2.next;
}
cur = cur.next;
}
if (l1 != null) {
cur.next = l1;
}
else {
cur.next = l2;
}
return res.next;
}
}
总结:注意java的写法,见另一篇关于此的博客(运算符用法比较)。
解法二 递归法
python
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
if (l1 == None or l2 == None): # (l1 or l2)这个条件是错误的
return l1 or l2 # l2 if (l1==None) else l1
if (l1.val <= l2.val):
l1.next = self.mergeTwoLists(l1.next, l2)
return l1
else:
l2.next = self.mergeTwoLists(l1, l2.next)
return l2
总结:注意图中的注释;关于递归,仍需一个章节进行巩固探索。
java
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if ((l1 == null) || (l2 == null)) { // 注:java里if要加括号
return l1 == null?l2:l1;
}
if (l1.val <= l2.val) {
l1.next = mergeTwoLists(l1.next, l2);
return l1;
}
else {
l2.next = mergeTwoLists(l1, l2.next);
return l2;
}
}
}
总结:①注意图中java语法;递归的东西学了忘,原因是没有及时复习巩固。