两数相加
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
输入:l1 = [0], l2 = [0]
输出:[0]
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]
提示:
每个链表中的节点数在范围 [1, 100] 内
0 <= Node.val <= 9
题目数据保证列表表示的数字不含前导零
Problem: 2. 两数相加
思路
首先这道题是利用两个单链表进行操作,排除各种特殊情况,只需要设置两个指针,l1和l2,分别指向输入的两个单链表,通过将l1.val+l2.val的值赋值给一个新的结点,之后将节点连接起来便解决了。其中特殊情况有:
①l1.val+l2.val会大于10,此时要保存对10取余的结果到新节点上;并且设置一个进位变量jin,每次的求和改为l1.val+l2.val+jin;jin变量在每次求和判断不大于10的时候就要赋值为0,相反则赋值为1。
②每个节点连接起来,这个时候需要两个节点lq和lb,lq表示上个节点,lb表示当前节点,在把计算结果赋值到lb中后,让lq指向lb,之后再让lq=lb这样通过循环就能连接起来了。
③l1和l2的长度不确定,可能出现其中一个遍历结束了,但是另一个还没有结束,所有在之前的求和式子中改为(l1!=null ? l1.val:0)+(l2!=null ? l2.val:0)+jin,这样可以是遍历结束的链表后续元素当作0来处理。
复杂度
- 时间复杂度:
添加时间复杂度, 示例: O ( m a x ( n + m ) ) O(max(n+m)) O(max(n+m))
- 空间复杂度:
添加空间复杂度, 示例: O ( m a x ( n + m ) ) O(max(n+m)) O(max(n+m))
Code(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) {
ListNode l3=new ListNode();//头节点
ListNode lh=new ListNode();//前节点
int jin=0;//判断进位
lh=l3;
while(l1!=null || l2!=null){
ListNode lb=new ListNode();//后节点
int temp=(l1!=null ? l1.val:0)+(l2!=null ? l2.val:0)+jin;
jin=temp/10;
temp%=10;
lb.val=temp;
lh.next=lb;
lh=lb;
l1=(l1!=null? l1.next:null);
l2=(l2!=null? l2.next:null);
}
if(jin==1) lh.next=new ListNode(1);
return l3.next;
}
}
Code(python)
代码未优化
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution(object):
def addTwoNumbers(self, l1, l2):
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
l3=ListNode()
now=l1.val+l2.val
jin=0
if now>=10:
jin=1
now=now%10
l3.val=now
lq=ListNode()
lq=l3
t1=l1.next
t2=l2.next
while (t1!=None and t2!=None):
lb=ListNode()
t3=t1.val+t2.val+jin
if t3>=10:
t3=t3-10
jin=1
else:
jin=0
lb.val=t3
lq.next=lb
lq=lb
t1=t1.next
t2=t2.next
con=None
if t1!=None or t2!=None:
if t1!=None:
con=t1
elif t2!=None:
con=t2
while (con!=None):
lb=ListNode()
t3=con.val+jin
if t3>=10:
t3=t3%10
jin=1
else:
jin=0
lb.val=t3
lq.next=lb
lq=lb
con=con.next
if jin==1:
lb=ListNode()
lb.val=1
lq.next=lb
lq=lb
return l3