1.题目描述
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:
输入: l1 = [1,2,4], l2 = [1,3,4]
输出: [1,1,2,3,4,4]
示例2:
输入: l1 = [], l2 = []
输出:[]
示例3:
输入: l1 = [], l2 = [0]
**输出:**77[0]
2.解法
2.1 递归
这个递归就是一看就会,一写就废。(我是这样)
官方题解给了一个类似动态规划中状态转移方程的公式。其实不如直接看代码。
就是将两个链表表头中的更小的值取出,之后就出现了两个新的链表,再将这两个链表重新放进Merge函数,一直到某个链表为空。
忘记链表概念的同学,可以看这个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 list1, ListNode list2) {
if(list1==null){
return list2;
}
else if(list2==null){
return list1;
}
else if(list1.val<list2.val){
list1.next = mergeTwoLists(list1.next,list2);
return list1;
}
else{
list2.next = mergeTwoLists(list2.next,list1);
return list2;
}
}
}
2.2 迭代
迭代肯定是大家普遍能想到的方式。
方法就是用一个新建的节点不断在两个链表的头节点中比较,取较小的值放入自己的末尾,最后将未空的链表直接接到新建的节点末尾,最后去掉无用的头节点就可以返回了。
因为我一年之前用C++写过,所以这里我会放C++和Java两个版本的代码。
C++版本:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode newHead(0);
ListNode *temp = &newHead;
while(l1&&l2){
if(l1->val > l2->val) swap(l1,l2);
temp->next = l1;
l1= l1->next;
temp = temp->next;
}
temp->next = l1?l1:l2;
return newHead.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 list1, ListNode list2) {
ListNode prehead = new ListNode(0);
ListNode prev = prehead;
while(list1!=null&&list2!=null){
if(list1.val<=list2.val){
prev.next = list1;
list1 = list1.next;
}
else{
prev.next = list2;
list2 = list2.next;
}
prev = prev.next;
}
prev.next = list1 == null ? list2 : list1;
return prehead.next;
}
}