前端
其实今天差点就打乱每日行程了,早上按时起床背完单词,然后今早在看html的书,看到第四章,说要把自己的网站发布上去。然后我就去找办法,如何白嫖个域名,临时学习一下如何发布网站就好了。没想到搜了半天之后就搜到了搭建自己的博客,利用github和hexo创建属于自己的博客,听起来有点帅,就尝试学着搭建,一弄就弄到了下午。创建过程曲折,总有奇怪的错误,然后解决,最后成功创建了。可是自己又不想套用别人的blog架构,但是自己目前的能力搭起来会很慢,所以我就决定先把他放在那,等我把前端知识学完,第一个实践的项目就是搭建好自己的blog界面!
今天记录的要点不多,等明天一起发了。
算法题
来源:力扣(LeetCode)138
给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。
要求返回这个链表的 深拷贝。
我们用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index] 表示:
- val:一个表示 Node.val 的整数。
- random_index:随机指针指向的节点索引(范围从 0 到 n-1);如果不指向任何节点,则为 null 。
示例1:
输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]
示例 2:
输入:head = [[1,1],[2,1]]
输出:[[1,1],[2,1]]
示例 3:
输入:head = [[3,null],[3,0],[3,null]]
输出:[[3,null],[3,0],[3,null]]
示例 4:
输入:head = []
输出:[]
解释:给定的链表为空(空指针),因此返回 null。
提示:
-10000 <= Node.val <= 10000
Node.random 为空(null)或指向链表中的节点。
节点数目不超过 1000 。
解题思路
复制一个普通的链表很简单,但是当多了一个random节点之后,就会让复制变得困难。困难点在当前节点的random节点是链表的第几个,我们在链表中的信息只能得到当前节点的random节点是哪一个,所以我们就利用map,让每一个链表节点都有一个相应的id,就能确切知道当前节点的random节点是链表的第几个,接下来的复制工作就不那么复杂了。
/*
// Definition for a Node.
class Node {
public:
int val;
Node* next;
Node* random;
Node(int _val) {
val = _val;
next = NULL;
random = NULL;
}
};
*/
class Solution {
public:
Node* copyRandomList(Node* head) {
std::map<Node*,int> node_map;
std::vector<Node*>node_vec;//存放复制节点
Node *ptr=head;
int i =0;
while(ptr){
node_vec.push_back(new Node(ptr->val));//放在末尾
node_map[ptr]=i;//给原链表每个节点一个id
ptr=ptr->next;//遍历链表
i++;
}
node_vec.push_back(0);//为了不用处理最后一个节点
ptr=head;
i=0;
while(ptr){
node_vec[i]->next=node_vec[i+1];//新链表链接
if(ptr->random){
int id=node_map[ptr->random];//找到原链表random节点的id
node_vec[i]->random=node_vec[id];//链接random节点
}
ptr=ptr->next;
i++;
}
return node_vec[0];
}
};
算法题
题目:来源:力扣(LeetCode)
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 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 均按 非递减顺序 排列
解题思路
这道题题目不难,就两个链表从头对比,,最后需要注意就是,其中一个链表长度比另一个长,需要补上去。
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode temp_head(0);
ListNode *pre=&temp_head;
while(l1&&l2){
if(l1->val<l2->val){
pre->next=l1;
l1=l1->next;
}else{
pre->next=l2;
l2=l2->next;
}
pre=pre->next;
}
if(l1){
pre->next=l1;
}
if(l2){
pre->next=l2;
}
return temp_head.next;
}
};