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;
}
}