[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;
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM