001、两数之和
无序数组,找出和为target的两个数,用hashmap存储遍历的数x及其下标,若target-x在hashmap中,即找出一组解。
002、两数相加
用链表模拟大数加法的问题,用carry表示是否进位,注意每次判断2个链表对应节点相加时,大于10时需要把carry置为1,小于10时把carry置为0,不要漏掉其中一个else,否则carry会被默认为之前的值。
add_two_sum.cpp
003、删除链表的倒数第n个结点
首先计算链表的总长度,然后遍历链表删除指定结点。注意需要判断删除的是不是头结点。
两次遍历链表,时间复杂度为O(n)
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* p = head;
int len = 0;
//计算链表的长度
while(p != NULL){
len++;
p = p->next;
}
//判断n的有效性和链表是否为空
if(n < 1 || n > len || len == 0){
return head;
}
int j = len -n;
p = head;
int i = 1;
//删除头结点
if(j == 0){
return head->next;
}
//链表遍历
while(p != NULL){
if(i == j){
p->next = p->next->next;
return head;
}
p = p->next;
i++;
}
return head;
}
};