记录LeetCode第五天(21. Merge Two Sorted Lists)
1. 题目
Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.
2.例子
Example:
Input: 1->2->4, 1->3->4
Output: 1->1->2->3->4->4
这个例子就很坏了
补充例子
input: [],[1]
output: [1]
input: [2] [1]
output: [1,2]
所以其实就是从小到大排序,并不是交叉合起来。
3. 代码
class Solution {
public:
ListNode *head, *tail;
ListNode *p = 0;
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
head = tail = 0;
ListNode *p1,*p2;
p1 = l1 , p2 = l2;
int value=0;
vector<int> a;
while(p1 !=NULL || p2 !=NULL)//读所有的值到vector里面
{
if(p1 !=NULL)
{
value = p1->val;
a.push_back(value);
p1 = p1-> next;
}
if(p2 !=NULL)
{
value = p2 ->val;
a.push_back(value);
p2 = p2 -> next;
}
}
while(!a.empty())//按大小排序写到新链表里面
{
auto smallest = min_element(begin(a),end(a));
addnode(*smallest);
a.erase(begin(a)+distance(begin(a),smallest));
}
return head;
}
void addnode(int value)//加结点到链表里
{
if(tail!=0)
{
tail -> next = new ListNode(value);
tail = tail -> next;
}
else
head = tail = new ListNode(value);
}
};
虽然很长很长。。。但是还算好懂吧,第一次用链表还是很棒棒。至少速度够快。
然后是评论区厉害的大神(StefanPochmann)的代码
class Solution {
public:
ListNode* mergeTwoLists(ListNode* a, ListNode* b) {
if (!a || b && a->val > b->val) swap(a, b);
if (a) a->next = mergeTwoLists(a->next, b);
return a;
}
};
4. 链表
最简单的其实就是
struct ListNode {
int val;
ListNode *next;
}
每一个节点里面包含了当前节点的值val
和一个指向下一个节点的指针next
。
定义一个链表(或者表示链表节点):ListNode *lis
; 调用结点里面值lis->value
,调用节点中指向下一个节点的指针lis->next
。
创建一个列表:
ListNode *lis = new ListNode(val1);
lis->next = new ListNode(val2);
lis->next->next = new ListNode(val3);
链表有一个表示链表开头节点的head,一般定义为:ListNode *head
和一个表示链表最后一个节点的tail, 一般定义为ListNode *tail
然后表示一个链表的时候用的是它的第一个结点head.
都要初始化为0或者NULL。
并且两个结点可以直接等号赋值。
然后有一个厉害的大神
https://zhuanlan.zhihu.com/p/22923273
讲的很详细,第一次看链表一下就看懂了。但是我这种奇奇怪怪的脑回路很可能理解的还有讲的就不是很准确了。
5.就是vector的几个函数
先有vector<int> vec
吧
vec.distance(指针1,指针2)
就可以找到之间的距离
vec.empty()
好像之前说过,就是如果空的就返回true. 所以非空循环就是while(!vec.empty())
vec.min_element(指针1,指针2)
就可以找到最小值的指针*min_element(指针1,指针2)
就是最小值
vec.max_element(指针1,指针2)
相对的就是最大值指针*max_element(指针1,指针2)
就是最大值
还有最大最小的类型是std::vector<double>::iterator
就是 https://stackoverflow.com/questions/2953491/finding-the-position-of-the-max-element 里面的
std::cout << std::distance(sampleArray.begin(), std::max_element(sampleArray.begin(), sampleArray.end()))
就是一个很胖胖的例子。
然后还有删除并同时减小容器内存的vec.erase(指针)
。
https://blog.csdn.net/dongyanxia1000/article/details/52838922
很详细,各种类型删除。