[LintCode]链表求和

问题分析:

我们通过遍历两个链表拿到每个位的值,两个值加上前一位进位值(0或者1)模10就是该位的值,除以10就是向高位的进位值(0或者1)。

由于两个链表可以不一样长,所以要及时判断,一旦为null,该位的值就要变成0。

有一种情况比较特殊,比如:1->1->1->null, 9->8->8->null,最终结果为0->0->0->1->null,需要保留最高位。

而1->1->1->null, 9->8->7->null,最终结果为0->0->9->null,则不需要保留最高位,最后应该加一个判断。

问题求解:

public class Solution {

    public ListNode addLists(ListNode l1, ListNode l2) {
        ListNode preListNode = new ListNode(0);
        ListNode nowListNode = new ListNode(0);
        ListNode resultListNode = null;
        int val = 0;// 当前位置的数
        int add = 0;// 进位
        while (l1 != null || l2 != null) {
            //该位的数值
            val = ((l1 == null ? 0 : l1.val) + (l2 == null ? 0 : l2.val) + add) % 10;
            //对下一位产生的进位
            add = ((l1 == null ? 0 : l1.val) + (l2 == null ? 0 : l2.val) + add) / 10;
            l1 = l1 == null ? l1 : l1.next;//判断l1是否往下移动
            l2 = l2 == null ? l2 : l2.next;//判断l2是否往下移动
            //nowListNode和nowListNode用来产生一个新的链表
            nowListNode.val = val;
            if (resultListNode == null) {
                resultListNode = nowListNode;
            }
            preListNode = nowListNode;
            nowListNode = new ListNode(0);
            preListNode.next = nowListNode;
        }
        //最后还要多来一次判断,因为有一种可能,两个链表一样长,最后一位又向上进了一位
        val = ((l1 == null ? 0 : l1.val) + (l2 == null ? 0 : l2.val) + add) % 10;
        add = ((l1 == null ? 0 : l1.val) + (l2 == null ? 0 : l2.val) + add) / 10;
        nowListNode.val = val;
        //如果最后一位又向上进了一位,新的最后一位不为0,应该保留,否则就为0,应当舍弃
        if(nowListNode.val == 0){
            preListNode.next = null;
        }
        return resultListNode;
    }
}

class ListNode {
    int val;
    ListNode next;

    ListNode(int x) {
        val = x;
        next = null;
    }
}

 

posted @ 2016-08-01 06:53  DarrenChan陈驰  阅读(2376)  评论(1编辑  收藏  举报
Live2D