鏈表求和(lintcode 167題以及221題)

package suanfa.lintcode;

import java.util.Stack;

//鏈表
class ListNode {
    int val;
    ListNode next;

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

public class SumListNode {

    /**
     * 鏈表求和1:你有兩個(gè)用鏈表代表的整數(shù),其中每個(gè)節(jié)點(diǎn)包含一個(gè)數(shù)字。數(shù)字存儲按照在原來整數(shù)中相反的順序,
     * 使得第一個(gè)數(shù)字位于鏈表的開頭。寫出一個(gè)函數(shù)將兩個(gè)整數(shù)相加,用鏈表形式返回和。
     * 
     * @param l1
     *            example:3->1->5->null
     * @param l2
     *            example:5->9->2->null
     * @return    
     *            example:8->0->8->null
     */
    public ListNode addListNode1(ListNode l1, ListNode l2) {
        ListNode result = new ListNode(0);
        ListNode node = result;
        // 進(jìn)位標(biāo)志
        int flag = 0;
        while (l1 != null && l2 != null) {
            int value = l1.val + l2.val + flag;
            flag = value / 10;
            value = value % 10;
            node.next = new ListNode(value);
            node = node.next;
            l1 = l1.next;
            l2 = l2.next;
        }
        while (l1 != null) {
            int value = l1.val + flag;
            flag = value / 10;
            value = value % 10;
            node.next = new ListNode(value);
            node = node.next;
            l1 = l1.next;
        }
        while (l2 != null) {
            int value = l2.val + flag;
            flag = value / 10;
            value = value % 10;
            node.next = new ListNode(value);
            node = node.next;
            l2 = l2.next;
        }
        if (flag == 1) {
            node.next = new ListNode(1);
            node = node.next;
        }
        return result.next;
    }

    /**
     * 鏈表求和2: 假定用一個(gè)鏈表表示兩個(gè)數(shù),其中每個(gè)節(jié)點(diǎn)僅包含一個(gè)數(shù)字。
     * 假設(shè)這兩個(gè)數(shù)的數(shù)字順序排列,請?jiān)O(shè)計(jì)一種方法將兩個(gè)數(shù)相加,并將其結(jié)果表現(xiàn)為鏈表的形式
     * 
     * @param l1
     *            example:6->1->7
     * @param l2
     *            example:2->9->5
     * @return    
     *            example:9->1->2
     */
    public ListNode addListNode2(ListNode l1, ListNode l2) {
        Stack<Integer> stack1 = getListNodeStack(l1);
        Stack<Integer> stack2 = getListNodeStack(l2);
        ListNode result = new ListNode(0);
        int flag = 0; // 進(jìn)位標(biāo)志

        // 對于兩個(gè)鏈表,長度相等時(shí)計(jì)算
        while (!stack1.isEmpty() && !stack2.isEmpty()) {
            int value = stack1.pop() + stack2.pop() + flag;
            flag = value / 10;
            value = value % 10;

            // 創(chuàng)建一個(gè)新的節(jié)點(diǎn)
            ListNode curr = new ListNode(value);
            // 當(dāng)前節(jié)點(diǎn)的next 指向之前的一個(gè)節(jié)點(diǎn)
            curr.next = result.next;
            // 將當(dāng)前節(jié)點(diǎn)存儲起來
            result.next = curr;
        }

        // 當(dāng)?shù)谝粋€(gè)鏈表長度大于第二個(gè)鏈表長度時(shí)
        while (!stack1.isEmpty()) {
            int value = stack1.pop() + flag;
            flag = value / 10;
            value = value % 10;

            // 創(chuàng)建一個(gè)新的節(jié)點(diǎn)
            ListNode curr = new ListNode(value);
            // 當(dāng)前節(jié)點(diǎn)的next 指向之前的一個(gè)節(jié)點(diǎn)
            curr.next = result.next;
            // 將當(dāng)前節(jié)點(diǎn)存儲起來
            result.next = curr;
        }

        // 當(dāng)?shù)诙€(gè)鏈表長度大于第一個(gè)鏈表長度時(shí)
        while (!stack2.isEmpty()) {
            int value = stack2.pop() + flag;
            flag = value / 10;
            value = value % 10;

            // 創(chuàng)建一個(gè)新的節(jié)點(diǎn)
            ListNode curr = new ListNode(value);
            // 當(dāng)前節(jié)點(diǎn)的next 指向之前的一個(gè)節(jié)點(diǎn)
            curr.next = result.next;
            // 將當(dāng)前節(jié)點(diǎn)存儲起來
            result.next = curr;
        }

        // 如果flag等于1,則需要?jiǎng)?chuàng)建一個(gè)新的節(jié)點(diǎn)
        if (flag == 1) {
            ListNode curr = new ListNode(1);
            curr.next = result.next;
            result.next = curr;
        }

        return result.next;
    }

    /**
     * 將鏈表存儲到棧里面
     * 
     * @param node
     * @return Stack
     */
    public Stack<Integer> getListNodeStack(ListNode node) {
        Stack<Integer> stack = new Stack<>();
        while (node != null) {
            stack.push(node.val);
            node = node.next;
        }
        return stack;
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 分析 注意進(jìn)位
    胡哈哈哈閱讀 522評論 0 0
  • 題目 描述 你有兩個(gè)用鏈表代表的整數(shù),其中每個(gè)節(jié)點(diǎn)包含一個(gè)數(shù)字。數(shù)字存儲按照在原來整數(shù)中相反的順序,使得第一個(gè)數(shù)字...
    悠揚(yáng)前奏閱讀 184評論 0 0
  • 你有兩個(gè)用鏈表代表的整數(shù),其中每個(gè)節(jié)點(diǎn)包含一個(gè)數(shù)字。數(shù)字存儲按照在原來整數(shù)中相反的順序,使得第一個(gè)數(shù)字位于鏈表的開...
    jova_y閱讀 255評論 0 1
  • 版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。 難度:中等 要求: 你有兩個(gè)用鏈表代表的整數(shù),其中每個(gè)節(jié)點(diǎn)包...
    柒黍閱讀 644評論 0 0
  • 夜半窗外風(fēng)怒號, 歲末心頭鼓急敲。 猶記豪情放新鷂, 可憐軀殘斷老腰。 臥床拜仙求神術(shù), 冰凍斗志不枯槁。 只待天...
    半是瞎忙半是閑閱讀 381評論 3 3

友情鏈接更多精彩內(nèi)容