|
|
||
|---|---|---|
| .. | ||
| README.md | ||
| README_EN.md | ||
| Solution.cpp | ||
| Solution.go | ||
| Solution.java | ||
| Solution.js | ||
| Solution.py | ||
| Solution.rs | ||
| Solution.swift | ||
| Solution.ts | ||
README_EN.md
| comments | difficulty | edit_url |
|---|---|---|
| true | Medium | https://github.com/doocs/leetcode/edit/main/lcci/02.05.Sum%20Lists/README_EN.md |
02.05. Sum Lists
Description
You have two numbers represented by a linked list, where each node contains a single digit. The digits are stored in reverse order, such that the 1's digit is at the head of the list. Write a function that adds the two numbers and returns the sum as a linked list.
Example:
Input: (7 -> 1 -> 6) + (5 -> 9 -> 2). That is, 617 + 295. Output: 2 -> 1 -> 9. That is, 912.
Follow Up: Suppose the digits are stored in forward order. Repeat the above problem.
Example:
Input: (6 -> 1 -> 7) + (2 -> 9 -> 5). That is, 617 + 295. Output: 9 -> 1 -> 2. That is, 912.
Solutions
Solution 1: Simulation
We traverse two linked lists l_1 and l_2 simultaneously, and use a variable carry to indicate whether there is a carry-over currently.
During each traversal, we take out the current digit of the corresponding linked list, calculate the sum of them and the carry-over carry, then update the value of the carry-over, and finally add the value of the current digit to the answer linked list. The traversal ends when both linked lists have been traversed and the carry-over is 0.
Finally, we return the head node of the answer linked list.
The time complexity is O(\max(m, n)), where m and n are the lengths of the two linked lists respectively. We need to traverse all positions of the two linked lists, and it only takes O(1) time to process each position. Ignoring the space consumption of the answer, the space complexity is O(1).
Python3
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
dummy = ListNode()
carry, curr = 0, dummy
while l1 or l2 or carry:
s = (l1.val if l1 else 0) + (l2.val if l2 else 0) + carry
carry, val = divmod(s, 10)
curr.next = ListNode(val)
curr = curr.next
l1 = l1.next if l1 else None
l2 = l2.next if l2 else None
return dummy.next
Java
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode dummy = new ListNode(0);
int carry = 0;
ListNode cur = dummy;
while (l1 != null || l2 != null || carry != 0) {
int s = (l1 == null ? 0 : l1.val) + (l2 == null ? 0 : l2.val) + carry;
carry = s / 10;
cur.next = new ListNode(s % 10);
cur = cur.next;
l1 = l1 == null ? null : l1.next;
l2 = l2 == null ? null : l2.next;
}
return dummy.next;
}
}
C++
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* dummy = new ListNode(0);
ListNode* cur = dummy;
int carry = 0;
while (l1 || l2 || carry) {
carry += (!l1 ? 0 : l1->val) + (!l2 ? 0 : l2->val);
cur->next = new ListNode(carry % 10);
cur = cur->next;
carry /= 10;
l1 = l1 ? l1->next : l1;
l2 = l2 ? l2->next : l2;
}
return dummy->next;
}
};
Go
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
dummy := &ListNode{}
cur := dummy
carry := 0
for l1 != nil || l2 != nil || carry > 0 {
if l1 != nil {
carry += l1.Val
l1 = l1.Next
}
if l2 != nil {
carry += l2.Val
l2 = l2.Next
}
cur.Next = &ListNode{Val: carry % 10}
cur = cur.Next
carry /= 10
}
return dummy.Next
}
TypeScript
/**
* Definition for singly-linked list.
* class ListNode {
* val: number
* next: ListNode | null
* constructor(val?: number, next?: ListNode | null) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
* }
*/
function addTwoNumbers(l1: ListNode | null, l2: ListNode | null): ListNode | null {
if (l1 == null || l2 == null) {
return l1 && l2;
}
const dummy = new ListNode(0);
let cur = dummy;
while (l1 != null || l2 != null) {
let val = 0;
if (l1 != null) {
val += l1.val;
l1 = l1.next;
}
if (l2 != null) {
val += l2.val;
l2 = l2.next;
}
if (cur.val >= 10) {
cur.val %= 10;
val++;
}
cur.next = new ListNode(val);
cur = cur.next;
}
if (cur.val >= 10) {
cur.val %= 10;
cur.next = new ListNode(1);
}
return dummy.next;
}
Rust
impl Solution {
pub fn add_two_numbers(
mut l1: Option<Box<ListNode>>,
mut l2: Option<Box<ListNode>>,
) -> Option<Box<ListNode>> {
let mut dummy = Some(Box::new(ListNode::new(0)));
let mut cur = dummy.as_mut();
while l1.is_some() || l2.is_some() {
let mut val = 0;
if let Some(node) = l1 {
val += node.val;
l1 = node.next;
}
if let Some(node) = l2 {
val += node.val;
l2 = node.next;
}
if let Some(node) = cur {
if node.val >= 10 {
val += 1;
node.val %= 10;
}
node.next = Some(Box::new(ListNode::new(val)));
cur = node.next.as_mut();
}
}
if let Some(node) = cur {
if node.val >= 10 {
node.val %= 10;
node.next = Some(Box::new(ListNode::new(1)));
}
}
dummy.unwrap().next
}
}
JavaScript
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} l1
* @param {ListNode} l2
* @return {ListNode}
*/
var addTwoNumbers = function (l1, l2) {
let carry = 0;
const dummy = new ListNode(0);
let cur = dummy;
while (l1 || l2 || carry) {
carry += (l1?.val || 0) + (l2?.val || 0);
cur.next = new ListNode(carry % 10);
carry = Math.floor(carry / 10);
cur = cur.next;
l1 = l1?.next;
l2 = l2?.next;
}
return dummy.next;
};
Swift
/**
* Definition for singly-linked list.
* class ListNode {
* var val: Int
* var next: ListNode?
* init(_ val: Int) {
* self.val = val
* self.next = nil
* }
* }
*/
class Solution {
func addTwoNumbers(_ l1: ListNode?, _ l2: ListNode?) -> ListNode? {
var carry = 0
let dummy = ListNode(0)
var current: ListNode? = dummy
var l1 = l1, l2 = l2
while l1 != nil || l2 != nil || carry != 0 {
let sum = (l1?.val ?? 0) + (l2?.val ?? 0) + carry
carry = sum / 10
current?.next = ListNode(sum % 10)
current = current?.next
l1 = l1?.next
l2 = l2?.next
}
return dummy.next
}
}