将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:
输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4]
示例 2:
输入:l1 = [], l2 = [] 输出:[]
示例 3:
输入:l1 = [], l2 = [0] 输出:[0]
提示:
- 两个链表的节点数目范围是
[0, 50]
-100 <= Node.val <= 100
l1
和l2
均按 非递减顺序 排列
/**
* 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* list1, ListNode* list2) {
ListNode* prehead=new ListNode(-1);
ListNode* prev=prehead;
while(list1!=nullptr&&list2!=nullptr){
if(list1->val<list2->val){
prev->next=list1;
list1=list1->next;
}else{
prev->next=list2;
list2=list2->next;
}
prev=prev->next;
}
prev->next=list1?list1:list2;
return prehead->next;
}
};
这段代码是用于合并两个有序链表的函数。函数的输入是两个指向链表头节点的指针list1和list2,返回合并后的链表的头节点。
首先,创建一个新的虚拟头节点prehead,并创建一个指针prev用于记录当前节点的前一个节点。
然后,使用while循环,当两个链表都不为空时,进行以下操作:
-
比较list1和list2当前节点的值,如果list1当前节点的值小于list2当前节点的值,将prev的后继指针指向list1的当前节点,然后将list1指针指向下一个节点;否则,将prev的后继指针指向list2的当前节点,然后将list2指针指向下一个节点。
-
将prev指针指向当前节点。
循环结束后,检查哪个链表还有剩余节点,将prev的后继指针指向剩余的链表节点。
最后,返回prehead的下一个节点,即合并后的链表的头节点。
/**
* 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* list1, ListNode* list2) {
if (list1 == nullptr)
return list2;
else if (list2 == nullptr)
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;
}
}
};
这段代码也是用于合并两个有序链表的函数。函数的输入是两个指向链表头节点的指针list1和list2,返回合并后的链表的头节点。
首先,检查特殊情况,如果其中一个链表为空,则直接返回另一个链表。
然后,比较list1和list2当前节点的值。如果list1当前节点的值小于list2当前节点的值,将list1的下一个节点指向两个链表剩余部分的合并结果,即调用递归函数mergeTwoLists(list1->next, list2);然后返回list1作为合并后的链表的头节点。
否则,将list2的下一个节点指向两个链表剩余部分的合并结果,即调用递归函数mergeTwoLists(list2->next, list1);然后返回list2作为合并后的链表的头节点。
递归的过程相当于将两个链表从头节点开始依次比较,每次选择较小的节点作为当前节点,然后递归地处理剩余的部分,直到其中一个链表为空。
最后,返回合并后的链表的头节点。