繼昨天的問題,更換思路,使用鏈表邊遍歷邊相加的思路。
首先在不考慮進(jìn)位的情況下,完成邊遍歷邊相加的功能。其次再考慮進(jìn)位的情況。
/**
*
* @param {ListNode} l1
* @param {ListNode} l2
* return {ListNode}
*/
var addTwoNumbers = (l1, l2) => {
// 創(chuàng)建頭指針
let result = new ListNode(null);
let head = result;
// 遍歷鏈表,同時(shí)遍歷l1,l2
while (l1 != null || l2 != null) {
let temp1 = l1 != null ? l1.val : 0;
let temp2 = l2 != null ? l2.val : 0;
// 創(chuàng)建子節(jié)點(diǎn)
head.next = new ListNode(temp1 + temp2);
// 移動頭指針
head = head.next;
// 移動參數(shù)鏈表指針
if (l1 != null) {
l1 = l1.next;
}
if (l2 != null) {
l2 = l2.next;
}
}
return result.next;
};
進(jìn)位的難點(diǎn)其實(shí)在于最高位進(jìn)位時(shí),我們需要再創(chuàng)建一個(gè)子節(jié)點(diǎn)。
/**
*
* @param {ListNode} l1
* @param {ListNode} l2
* return {ListNode}
*/
var addTwoNumbers = (l1, l2) => {
// 創(chuàng)建頭指針
let result = new ListNode(null);
let head = result;
// 進(jìn)位
let carry = 0;
while (l1 != null || l2 != null) {
let temp1 = l1 != null ? l1.val : 0;
let temp2 = l2 != null ? l2.val : 0;
// 帶進(jìn)位加
let sum = temp2 + temp1 + carry;
// 計(jì)算進(jìn)位
carry = Math.floor(sum / 10);
// 創(chuàng)建子節(jié)點(diǎn)
head.next = new ListNode(sum % 10);
// 移動頭指針
head = head.next;
// 移動參數(shù)鏈表指針
if (l1 != null) {
l1 = l1.next;
}
if (l2 != null) {
l2 = l2.next;
}
}
// 如果最高位有進(jìn)位,則需要多創(chuàng)建一個(gè)節(jié)點(diǎn)。
if (carry > 0) {
head.next = new ListNode(carry);
}
return result.next;
};

image.png
提交結(jié)果也是很滿意。題目一開始就在強(qiáng)調(diào)鏈表操作,本想取巧使用字符串的操作方式(其實(shí)是把鏈表的知識忘沒了),所以還得努力啊。
第三題
無重復(fù)字符的最長子串
| Category | Difficulty | Likes | Dislikes |
|---|---|---|---|
| algorithms | Medium (32.04%) | 2737 | - |
給定一個(gè)字符串,請你找出其中不含有重復(fù)字符的 最長子串 的長度。
示例 1:
輸入: "abcabcbb"
輸出: 3
解釋: 因?yàn)闊o重復(fù)字符的最長子串是 "abc",所以其長度為 3。
示例 2:
輸入: "bbbbb"
輸出: 1
解釋: 因?yàn)闊o重復(fù)字符的最長子串是 "b",所以其長度為 1。
示例 3:
輸入: "pwwkew"
輸出: 3
解釋: 因?yàn)闊o重復(fù)字符的最長子串是 "wke",所以其長度為 3。
請注意,你的答案必須是 子串 的長度,"pwke" 是一個(gè)子序列,不是子串。
思路,遍歷字符串,用中間變量存儲子串,判斷每個(gè)字符是否存在于中間變量中,如果存在,截取字符串。
/**
* @param {string} s
* @return {number}
*/
var lengthOfLongestSubstring = function(s) {
// 字符串長度
let len = s.length;
// 子串長度
let count = 0;
// 中間字符串
let tempStr = '';
for (let i = 0; i < len; i++) {
if (tempStr.indexOf(s[i]) == -1) {
// 如果當(dāng)前字符不存在,把字符添加到中間字符串中
tempStr += s[i];
// 如果中間字符串長度大于子串長度,更新子串長度
if (tempStr.length > count) {
count = tempStr.length;
}
} else {
// 如果當(dāng)前字符存在
tempStr += s[i];
// 找到當(dāng)前字符在原字符串中的位置
let index = tempStr.indexOf(s[i]);
// 截取原字符串
tempStr = tempStr.slice(index + 1);
}
}
return count;
};
時(shí)間效率上還是不錯的,但是空間上的占用還是比較的多。