题意
给你两个 非空
的链表,表示两个非负的整数。它们每位数字都是按照 逆序
的方式存储的,并且每个节点只能存储 一位
数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0
之外,这两个数都不会以 0
开头。
示例
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
解法
思路很简单,直接模拟一遍即可,由于输入的两个链表都是逆序存储的,所以可以从最低位到最高位逐位相加,如果和大于等于 10
,那么只保留个位数字,同时向前进位 1
如果最高位有进位,则需在最前面再补 1
。
参考代码:
1、Java
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
var dummy = new ListNode(-1);
ListNode cur = dummy;
int t = 0;
while (t != 0 || l1 != null || l2 != null) {
if (l1 != null) {
t += l1.val;
l1 = l1.next;
}
if (l2 != null) {
t += l2.val;
l2 = l2.next;
}
cur = cur.next = new ListNode(t % 10);
t /= 10;
}
return dummy.next;
}
}
2、Go
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
dummy := &ListNode{Val: -1}
cur := dummy
for t := 0; l1 != nil || l2 != nil || t != 0; {
if l1 != nil {
t += l1.Val
l1 = l1.Next
}
if l2 != nil {
t += l2.Val
l2 = l2.Next
}
cur.Next = &ListNode{Val: t % 10}
cur = cur.Next
t /= 10
}
return dummy.Next
}
- 时间复杂度:$O(n)$
- 空间复杂度:$O(1)$
评论区