每天一题LeetCode【第3天】

T2. Add Two Numbers 【Medium

感觉先看下面的 Example 比较容易理解题目

题目

给你两个非空链表,表示两个非负整数,数字是反向储存的(看例题)。它们的每个节点包含一个数字,把对应的数字加起来,将他们的和存为链表返回。

假定两数除了 0 本身以外都没有 leading zero(查了一下,意思就是没有01,02这样的数)

Example

解决:342+465=807
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8

思路

主要思路:

  • 设置初始进位位a=0
  • 链表三[i] = (链表一[i]+链表二[i]+a)%10
  • a = (链表一[i]+链表二[i]+a)/10
  • 重复二三两步

补充:

① 当两数长度不一时,需要进行处理,这里我把短的链表持续加 0 节点(相当于把 18+9 当做 18+09 )就行了。具体可以看代码以及里面的注释。

② 当有进位时要进位,若 a=1时要继续循环(例如9+8=17)

代码

这是自己的代码,已经 accepted,欢迎提出更好的解法~

/**
 * 给出的ListNode类
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        //新建一个 ListNode,其 value 为两个链表第一个数字的和的
        ListNode t1=new ListNode((l1.val+l2.val)%10);
        ListNode t2=t1;
        int a=(l1.val+l2.val)/10;
        //!a==0代表了有进位,所以还得循环
        while(!(l1.next==null)||!(l2.next==null)||a!=0){
            //添加0节点
            if(l1.next==null){
                l1.next=new ListNode(0);
            }
            if(l2.next==null){
                l2.next=new ListNode(0);
            }
            //与while对应把链表读完
            l1=l1.next;
            l2=l2.next;
            //把正确的值赋给 t1.next
            t1.next=new ListNode((l1.val+l2.val+a)%10);
            a=(l1.val+l2.val+a)/10;
            //把t1置为 t1=t1.next
            t1=t1.next; 
        }
        return t2;
    }
}

你可能感兴趣的:(每天一题LeetCode【第3天】)