問題描述

先來看看原題描述:

You are given two linked lists representing two non-negative numbers.
The digits are stored in reverse order and each of their nodes contain a single digit.
Add the two numbers and return it as a linked list.
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8

為方便,使用 Java 作爲實現之程式語言。

初始代碼如下:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        // Your implementations here
    }
}

觀察到如下幾點:

  • 題目定義了加法順序,從左至右帶進位運算;

  • 使用預定義的單鏈表數據結構;

  • 結果返回一個 ListNode 類型,應該是鏈表頭。

思考過程

思路如圖所示:

思路

Iterative 實現

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        /* Implementation begins */
        int carry = 0;
        int sum = 0;
        ListNode result = new ListNode(0);  // keep node list
        ListNode current = result;          // current pointer
        do {
            sum = (l1 != null ? l1.val : 0) + (l2 != null ? l2.val : 0) + carry;
            current.next = new ListNode(sum % 10);
            carry = sum / 10;
            l1 = l1 != null ? l1.next : null;
            l2 = l2 != null ? l2.next : null;
            current = current.next;
        } while (l1 != null || l2 != null);
        if (carry != 0) current.next = new ListNode(carry);
        return result.next;
        /* Implementation ends */
    }
}

Recursive 實現

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode dummy = new ListNode(0);
        return addTwoNumbers(l1, l2, 0, dummy, dummy);
    }
    
    private ListNode addTwoNumbers(ListNode l1, ListNode l2, int carry, ListNode current, ListNode result) {
        if (l1 == null && l2 == null) {
            if (carry != 0) current.next = new ListNode(carry);
            return result.next;
        } else {
            l1 = (l1 == null) ? new ListNode(0) : l1;
            l2 = (l2 == null) ? new ListNode(0) : l2;
        }
        int sum = l1.val + l2.val + carry;
        carry = sum / 10;
        current.next = new ListNode(sum % 10);
        return addTwoNumbers(l1.next, l2.next, carry, current.next, result);
    }
}

pianoguy
1 声望0 粉丝

Engineer/Developer - Mobile/Web/.Net