LeetCola_2_445_两数相加_0719M

2. 两数相加 public ListNode addTwoNumbers(ListNode l1, ListNode l2) {

求两个链表表达的数的和

链表非空

数据非负

但没有强调两个数据的位数是否一样 然而链表为逆序存储 所以位数并不影响

需要考虑进位的问题 两数之和%10为值 /10为进位

要求返回一个新链表

 

哑节点(dummy node)是初始值为NULL的节点,创建在使用到链表的函数中,可以起到避免处理头节点为空的边界问题的作用,减少代码执行异常的可能性。

 

  • 定义dummyHead节点
  • 用p q 代替l1 l2 的 head
  • 定义进位carry = 0
  • 如果 p 或 q 的值不为空
    • 如果p不为空 定义x为p的值, p为空 x为0 (如果直接用p.val 后面会遇到空指针异常)
    • 如果q不为空 定义y为q的值, q为空 y为0
    • 定义sum为 carry x y的值
    • carry = sum/10 即 进位值
    • curr的next指向值为 sum%10 的新节点
    • curr向后一个
    • 如果p不为空 则p后移一个
    • 如果q不为空 则q后移一个
  • 如果carry大于0 求最前面的进位
    • curr的next 指向以 carry为值的 新节点
  • 返回哑结点的next
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode sentinel = new ListNode(0);
        ListNode curr = sentinel;
        int carry = 0;
        while (l1 != null || l2 != null) {
            int x = (l1 != null) ? l1.val : 0;
            int y = (l2 != null) ? l2.val : 0;
            int sum = carry + x + y;
            carry = sum / 10;
            curr.next = new ListNode(sum % 10);
            curr = curr.next;
            if (l1 != null) l1 = l1.next;
            if (l2 != null) l2 = l2.next;
        }
        if (carry > 0) {
            curr.next = new ListNode(carry);
        }
        return sentinel.next;
    }

445.两数相加II
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {

给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。

因为两个链表是正序存的

与加法所计算的顺序是相反的

利用两个stack分别存储两个链表的数据 先入后出 直接

方法一

  • 建立两个栈
  • 如果l1不为空
    • 就压入栈
    • l1后移
  • 如果l2不为空
    • 就压入栈
    • l2后移
  • 建立进位carry 初始为0
  • 建立节点head 为空
  • 如果 栈1 栈2 不为空 carry不为空
    • 建立sum 初始为0
    • 把stack1弹出一位并加在sum上
    • 把stack2弹出一位并加在sum上
    • 建立node节点 值为sum%10
    • node的next等于head
    • head等于node
    • sum/10位进位
  • 返回head

方法二

反转链表

求和

反转链表

输出

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
	if(l1 == null) return l2;
	if(l2 == null) return l1;			}
	ListNode l1_reverse = reverse(l1);
	ListNode l2_reverse = reverse(l2);
	ListNode res = new ListNode(0);
	ListNode head = res;
	int tmp = 0;
	while(l1_reverse != null || l2_reverse != null) {
	    int a = l1_reverse == null ? 0 : l1_reverse.val;
	    int b = l2_reverse == null ? 0 : l2_reverse.val;
	    int sum = a + b + tmp;
	    tmp = sum / 10;
	    res.next = new ListNode(sum % 10);
	    res = res.next;
	    if(l1_reverse != null) l1_reverse = l1_reverse.next;
		if(l2_reverse != null) l2_reverse = l2_reverse.next;
	}
	if(tmp > 0) res.next = new ListNode(tmp);
	return reverse(head.next);
}

public ListNode reverse(ListNode head) {
	ListNode pre = null;
	while(head != null) {
	    ListNode tmp = head.next;
	    head.next = pre;
	    pre = head;
	    head = tmp;
	}
	return pre;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值