力扣-21-合并两个有序链表/剑指Offer-25-合并两个排序的链表
编码思路
首先是递归排序过程
- 比较两个链表的头节点大小,将更小的节点作为结果链表的头节点,并将这个节点从原链表中删除
- 递归地重复上述过程,直到两个链表都为空
要注意的情况是
- 当两个链表中某一个/全都为空
- 某一个链表的节点被一个个取出后变成了空链表
好像还没用过STL-list,简单去学习下
- STL-list为双向链表
- 不能通过下标直接访问人元素
实际场景中,如何需要对序列进行大量添加或删除元素的操作,而直接访问元素的需求却很少,这种情况建议使用 list 容器存储序列。
- 可以拷贝容器
std::list<int> value1(10); std::list<int> value2(value1);
- 通过拷贝其他类型容器(或者普通数组)中指定区域内的元素,可以创建新的 list 容器。
//拷贝普通数组,创建list容器
int a[] = { 1,2,3,4,5 };
std::list<int> values(a, a+5);
//拷贝其它类型的容器,创建 list 容器
std::array<int, 5>arr{ 11,12,13,14,15 };
std::list<int>values(arr.begin()+2, arr.end());//拷贝arr容器中的{13,14,15}
编写代码
题目中给出的是一个单向链表,只包含节点值和后指针
啊……所以不关list的事……
class Solution {
public:
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
if(list1 == nullptr){
return list2;
// 这里list2其实有两种情况,为空和不为空
// 但其实无论哪种情况都无所谓
}else if(list2== nullptr){
return list1;
}
ListNode* head;
if(list1->val>list2->val){
head = list2;
head->next = mergeTwoLists(list1,list2->next);
// 写了半天没写出来关键是没有理解这个方法的返回值
// 递归地返回:对两个链表的头节点进行比较后,选择出的较小元素的指针
}else{
head= list1;
head->next = mergeTwoLists(list1->next,list2);
}
return head;
}
};
写了一个小时没写出来,着实拉跨
复盘一下,这也是第一次写链表相关的题吧,最关键的是:没有理解到方法返回值——节点指针的对于解体意义。
本来口口声声说递归,结果写着写着就跑去绞尽脑汁写循环了
2024.7.24 重做
遇上又没做出来
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
if (list1 == null) return list2;
else if (list2 == null) return list1;
ListNode head;
if (list1.val > list2.val) {
head = list2;
head.next = mergeTwoLists(list1, list2.next);
} else {
head = list1;
head.next = mergeTwoLists(list1.next, list2);
}
return head;
}
每一层递归做了两件事
- 返回两个链表头节点中较小的那个
- 创建一个新节点,为它赋值并修改 next 指针指向
最终形成一个创建新链表的过程