leetCode之链表操作

2020-09-20  本文已影响0人  Benzic

首页目录 点击查看

第一题

示例

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

解题思路

之前一直没有碰过链表相关的东西,所以对于链表很陌生,在JS前端环境也没有链表这个东西,所以整体我都是参考题解来处理的。
我们使用变量来跟踪进位,并从包含最低有效位的表头开始模拟逐位相加的过程。


image.png

图1,对两数相加方法的可视化: 342 + 465 = 807342+465=807,每个结点都包含一个数字,并且数字按位逆序存储。
就像你在纸上计算两个数字的和那样,我们首先从最低有效位也就是列表 l1l1 和 l2l2 的表头开始相加。由于每位数字都应当处于 0 \ldots 90…9 的范围内,我们计算两个数字的和时可能会出现 “溢出”。例如,5 + 7 = 125+7=12。在这种情况下,我们会将当前位的数值设置为 22,并将进位 carry = 1carry=1 带入下一次迭代。进位 carrycarry 必定是 00 或 11,这是因为两个数字相加(考虑到进位)可能出现的最大和为 9 + 9 + 1 = 199+9+1=19。

伪代码如下:

测试用例 说明
l1=[0,1]l1=[0,1],l2=[0,1,2]l2=[0,1,2] 当一个列表比另一个列表长时
l1=[]l1=[],l2=[0,1]l2=[0,1] 当一个列表为空时,即出现空列表
l1=[9,9]l1=[9,9],l2=[1]l2=[1] 求和运算最后可能出现额外的进位,这一点很容易被遗忘

答案

var addTwoNumbers = function (l1, l2) {
    let node = new ListNode('head');
    let temp = node;//哑结点
    let add = 0;//是否进一
    let sum = 0;//新链表当前未取余的值 = 链表1值 + 链表2值 + add;
    //遍历,直到最长的都为空
    while (l1 || l2) {
        sum = (l1 ? l1.val : 0) + (l2 ? l2.val : 0) + add;
        temp.next = new ListNode(sum % 10);//取余则为新链表的值
        temp = temp.next;
        add = sum >= 10 ? 1 : 0;
        l1 && (l1 = l1.next);
        l2 && (l2 = l2.next);
    }
    add && (temp.next = new ListNode(add))
    return node.next;
};
image.png

第二题

给定一个链表: 1->2->3->4->5, 和 n = 2.

当删除了倒数第二个节点后,链表变为 1->2->3->5.

解题思路

1 -> 2 -> 3 -> 4 -> 5 -> null
第一步:  left与 right 的距离为 n + 1;
  left           right
dummy -> 1 -> 2 -> 3 -> 4 -> 5 -> null
第二步: 始终保持  left与 right 的距离为 n + 1, 向右移动, 直到 right 为 null, 此时  left 的位置就是要删除节点上一个的位置。
                 left             right
dummy -> 1 -> 2 -> 3 -> 4 -> 5 -> null

我的答案

var removeNthFromEnd = function (head, n) {
    let summay = new ListNode(0);
    summay.next = head;
    let left = summay;
    let right = summay;
    let offset = n + 1
    while (offset--) {
        right = right.next;
        if (offset > 1 && right === null) {
            return summay.next
        }
    }
    while (right) {
        right = right.next;
        left = left.next;
    }
    left.next = left.next.next
    return summay.next
};
image.png
上一篇 下一篇

猜你喜欢

热点阅读