2 Add two numbers
模拟手工加和的过程即可,结构体中提供了构造函数;需要注意的是两个链表可能不等长,需要分别处理剩下的位数,还有最高位加和可能存在进位也需处理。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
if (l1 == NULL) return l2;
if (l2 == NULL) return l1;
int c=0;//进位
ListNode* ret=NULL,*pNext=NULL,*pNode=NULL;
while(l1!=NULL && l2!=NULL){
//使用构造函数构造新节点
pNext = new ListNode(l1->val + l2->val + c);
c = pNext->val / 10; //计算进位
pNext->val = pNext->val % 10; //计算该位的数字
if (ret == NULL) //首个节点
ret = pNode = pNext;
else //头结点不为空
{
pNode->next = pNext;
pNode = pNext;
}
l1 = l1->next;
l2 = l2->next;
}
//处理链表l1剩余的高位
while (l1 != NULL)
{
pNext = new ListNode(l1->val + c);
c = pNext->val / 10;
pNext->val = pNext->val % 10;
pNode->next = pNext;
pNode = pNext;
l1 = l1->next;
}
//处理链表l2剩余的高位
while (l2 != NULL)
{
pNext = new ListNode(l2->val + c);
c = pNext->val / 10;
pNext->val = pNext->val % 10;
pNode->next = pNext;
pNode = pNext;
l2 = l2->next;
}
//如果有最高处的进位,需要增加结点存储
if (c > 0)
{
pNext = new ListNode(c);
pNode->next = pNext;
}
return ret;
}
};
3.Longest Substring Without Repeating Characters
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int n = s.length();
int i = 0, j = 0;
int maxLen = 0;
//字母ascii码94
bool exist[256] = {false};
while (j < n) {
//当遇到重复字母时,可能存在比已知更长的串
if (exist[s[j]]) {
maxLen = max(maxLen, j-i);
while (s[i] != s[j]) {
exist[s[i]] = false;
i++;
}
i++;
j++;
//否则标记
} else {
exist[s[j]] = true;
j++;
}
}
//别忘了处理剩余字串
maxLen = max(maxLen, n-i);
return maxLen;
}
};