問題描述
先來看看原題描述:
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);
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。