思路一:递归
# 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 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
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;
}
}
}
思路二:迭代,逐个对比,安在新链表上
# 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:
pre=ListNode(-1)#随便设一个头
p=pre
while l1 and l2:
if l1.val<l2.val:
p.next=l1
l1=l1.next
else:
p.next=l2
l2=l2.next
p=p.next
# 合并后 l1 和 l2 最多只有一个还未被合并完
#我们直接将链表末尾指向未合并完的链表即可
p.next=l1 if l1 is not None else l2
return pre.next
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode pre=new ListNode();
ListNode p=pre;
while(l1!=null && l2!=null){
if(l1.val<l2.val){
p.next=l1;
l1=l1.next;
}else{
p.next=l2;
l2=l2.next;
}
p=p.next;
}
p.next= l1==null?l2:l1;
return pre.next;
}
}
补充:88、合并两个有序数组【简单】
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
"""
Do not return anything, modify nums1 in-place instead.
"""
res=[]
i=j=0
while i<m or j<n:
if i==m:
res.append(nums2[j])
j+=1
elif j==n:
res.append(nums1[i])
i+=1
elif nums1[i]<nums2[j]:
res.append(nums1[i])
i+=1
else:
res.append(nums2[j])
j+=1
nums1[:]=res[:]
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
List<Integer> res=new ArrayList<>();
int i=0,j=0;
while(i<m || j<n){
if(i==m) {res.add(nums2[j]);j++;}
else if(j==n) {res.add(nums1[i]);i++;}
else if(nums1[i]<nums2[j]) {res.add(nums1[i]);i++;}
else {res.add(nums2[j]);j++;}
}
for (int x = 0; x < m + n; x++) {
nums1[x] = res.get(x);
}
}
}
不使用额外空间:在nums1从后往前,从nums1[m+n-1]的位置往前填充
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int p1 = m - 1, p2 = n - 1;
int tail = m + n - 1;
int cur;
while (p1 >= 0 || p2 >= 0) {
if (p1 == -1) {
cur = nums2[p2--];
} else if (p2 == -1) {
cur = nums1[p1--];
} else if (nums1[p1] > nums2[p2]) {
cur = nums1[p1--];
} else {
cur = nums2[p2--];
}
nums1[tail--] = cur;
}
}
}