更多算法实现见:https://github.com/Erindcl/Daily-algorithm
21. 合并两个有序链表
- 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
代码如下:
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} l1
* @param {ListNode} l2
* @return {ListNode}
*/
var mergeTwoLists = function(l1, l2) {
let l3 = new ListNode(0);
let p = l1, q = l2, r = l3;
while(p != null && q != null) {
if (p.val <= q.val) {
r.next = p;
r = r.next;
p = p.next;
} else {
r.next = q;
r = r.next;
q = q.next;
}
}
r.next = null;
if (q != null) {
r.next = q;
}
if (p != null) {
r.next = p;
}
l3 = l3.next;
return l3;
};
其他实现:
var mergeTwoLists = function(l1, l2) {
if(!l1){
return l2
}
if(!l2){
return l1
}
var head
if(l1.val > l2.val){
head = l2
l2 = l2.next
} else {
head = l1
l1 = l1.next
}
head.next = mergeTwoLists(l1, l2)
return head
};
67. 二进制求和
- 给定两个二进制字符串,返回他们的和(用二进制表示)。输入为非空字符串且只包含数字 1 和 0。
分析:为了方便后续的操作,需要将两字符串的长度设置为一样,所以在长度不足的字符串前面添加足够数目的0。从后往前遍历字符串,设置一个变量count表示是否需要进位,需要进位设count为1,无需进位则设count为0,设置数组存放计算后的结果。通过switch语句计算判断count、a[i]与b[i]三者和是多少,根据结果判断是否需要进位和当前值应设置为多少。判断到最好如果count值为1说明需还需要向前进一位。故向数组首部添加一个1。代码如下:
var addBinary = function(a, b) {
let arr = [];
let count = 0, aLen = a.length, bLen = b.length;
let temS = "0".repeat(Math.abs(aLen - bLen));
if (aLen > bLen) {
b = temS + b;
} else {
a = temS + a;
}
for (let i = Math.max(aLen,bLen) - 1; i >= 0; i--) {
switch (count + Number(a[i]) + Number(b[i])) {
case 3:
arr.unshift("1");
count = 1;
break;
case 2:
arr.unshift("0");
count = 1;
break;
case 1:
arr.unshift("1");
count = 0;
break;
default:
arr.unshift("0");
count = 0;
}
}
if (count == 1) {
arr.unshift("1");
}
return arr.join("");
};
其他实现:
var addBinary = function(a, b) {
let [i, j, c, s] = [a.length - 1, b.length - 1, 0, '']
while (i >= 0 || j >= 0 || c === 1) {
c += +(a[i--] || 0) + +(b[j--] || 0)
s = (c & 1) + s
c = c >> 1
}
return s
};