问题描述:
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
提示:
- 两个链表的节点数目范围是
[0, 50]
-100 <= Node.val <= 100
l1
和l2
均按 非递减顺序 排列
当看到这个题的时候,我一想不就是数据结构中的链表的合并嘛,合并的方法是某节点插入链表的方法,使用了双节点,图解我在题解中找到了思想类似
代码为:
class Solution {
public:
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
ListNode *l1;//指向链表list1
ListNode *l2;//指向链表list2
ListNode *x;//用于存储需要移动的节点
l1 = list1;
l2 = list2;
while(list1 -> next!=nullptr&& list2 -> next != nullptr){
if(l1->val > l2->val){
x=l1;
//链表的插入操作
l1 = l1->next;
x -> next =l2 -> next ;
l2 = x-> next;
}
}
l2 ->next =l1;//将链表节点插在l2的末尾
return list2;
}
};
于是运行结果是:
然后继续修改,代码:
class Solution {
public:
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
ListNode head = ListNode(-1);
ListNode *x = &head;
while(list1 !=nullptr&& list2 != nullptr){
if(list1->val <list2->val){
x -> next = list1;
}else{
x ->next = list2;
list2 = list2 -> next;
}
x=x -> next;
}
x->next = list1 == nullptr?list2:list1;
return head.next;
}
};
结果又是
突然想到这个在合并的时候有点像归并排序算法划分一次之后在合并,由此想到了使用递归的方法。
代码实现:
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if (l1 == nullptr) {
return l2;
} else if (l2 == nullptr) {
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;
}
}
};
还有一种想法是可以将链表转化成数组再进行合并