2.5给定两个用链表表示的整数,每个结点包含一个数位。这些数位是反向存放的,也就是个位排在链表首部。编写函数对这两个整数求和,并用链表形式返回结果。进阶:假设这些数位是正向存放的。


其实仔细想想是挺简单的,我们要做的只是记得进位。

LinkedListNode addLists(LinkedListNode l1, LinkedListNode l2, int carry)
//LinkedListNode addLists(LinkedListNode l1, LinkedListNode l2, int carry = 0)
{
    if (l1 == null && l2 == null $$ carry == 0)
    {
        return null;
    }
    
    LinkedListNode result = new LinkedListNode();
    int value = carry;
    if (l1 != null)
    {
        value += l1.data;
    }
    if (l2 != null)
    {
        value += l2.data;
    }
    
    result.data = value%10;
    
    LinkedListNode more = addLists(l1 == null? null : l1.next, l2 == null? null : l2.next, value >= 10? 1 :0);
    result.setNext(more);
}

 进阶:假设是正向存放的。

坑:1,注意双方长度,双方是末尾对齐的,不足的地方需要用0补足。

//2.5b进阶:假设这些数位是正向存放的
public class PartialSum
{
    public LinkedListNode sum = null;
    public int carry = 0;
}

LinkedListNode addLists(LinkedListNode l1, LinkedListNode l2)
{
    int len1 = length(l1);
    int len2 = length(l2);
    
    //用零填充较短的链表
    if (len1 < len2)
    {
        l1 = padList(l1, len2 - len1);
    }
    else
    {
        l2 = padList(l2, len1 - len2);
    }
    
    //对两个链表求和
    PartialSum sum = addListsHelper(l1, l2);
    
    //如有进位,则插入链表首部,否则,直接返回整个链表
    if (sum.carry == 0)
    {
        return sum.sum;
    }
    else
    {
        LinkedListNode result = insertBefore(sum.sum, sum.carry);
        return result;
    }
}

PartialSum addListsHelper(LinkedListNode l1, LinkedListNode l2)
{
    if (l1 == null && l2 == null)
    {
        PartialSum sum = new PartialSum();
        return sum;
    }
    
    //先递归为较小数字求和
    PartialSum sum = addListsHelper(l1.next, l2.next);
    
    //将进位和当前数据相加
    int val = sum.carry + l1.data + l2.data;
    
    //插入当前数字的求和结果
    LinkedListNode full_result = insertBefore(sum.sum, val % 10);
    
    //返回求和结果与进位值
    sum.sum = full_result;
    sum.carry = val/10;
    return sum;
}

//用零填充链表
LinkedListNode padList(LinkedListNode l,int padding)
{
    LinkedListNode head = l;
    for (int i = 0; i < padding; i++)
    {
        LinkedListNode n = new LinkedListNode(0, null, null);
        head.prev = n;
        n.next = head;
        head = n;
    }
    return head;
}

//辅助函数,将结点插入链表首部
LinkedListNode insertBefore(LinkedListNode list, int data)
{
    LinkedListNode node = new LinkedListNode(data, null, null);
    if (list != null)
    {
        list.prev = node;
        node.next = list;
    }
    return node;
}

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



猜您在找 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 给定两个正整数(二进制形式表示)A和B,问把A变为B需要改变多少位(bit)?也就是说,整数A和B的二进制表示中有多少位是不同的? 给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。 leetcode给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字 已有a、b两个链表,每个链表中的结点包括学好、成绩。要求把两个链表合并,按学号升序排列。 Leetcode练习(Python):第66题:给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外,这个整数不会以零开头。 Leetcode练习(Python):字符串类:第43题:字符串相乘:给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。 js两个整数之间求和 Oracle计算两个整数的和与这两个整数的差与商
 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM