这一题最后没有做出来,答案来自 题解的精解答案
先看题目吧:
思考:
342 +462 放在 链表中就是(2,4,3)和 (2,6,4),当我们对第一个链表元素进行操作的时候,就是对它的个位数操作,然后如果超过10就进位,这是符合我们平常的思考习惯的,你就不要再倒过来了。然后还要考虑,题目并没有说明 两个的位数是一样的,所以 假如说 232+46 要补成 232+046 ,也就是每一次循环完之后要判断 ,下个元素是否为空。此外比较需要注意的是,你的List的定义。
以下是答案。
/**
* 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) {
}
}
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode pre = new ListNode(0);
ListNode cur = pre;
int carry = 0;
while(l1 != null || l2 != null) {
int x = l1 == null ? 0 : l1.val;
int y = l2 == null ? 0 : l2.val;
int sum = x + y + carry;
carry = sum / 10;
sum = sum % 10;
cur.next = new ListNode(sum);
cur = cur.next;
if(l1 != null)
l1 = l1.next;
if(l2 != null)
l2 = l2.next;
}
if(carry == 1) {
cur.next = new ListNode(carry);
}
return pre.next;
}
}
参考:https://leetcode-cn.com/problems/add-two-numbers/solution/hua-jie-suan-fa-2-liang-shu-xiang-jia-by-guanpengc/
ListNode的结构在注释中已经给了
public class ListNode {
int val;
ListNode next; // 下一个链表对象
ListNode(int x) { val = x; } //赋值链表的值
}
中心思想 carry用来表示 进位, sum用来表示 真正存到链表的值 ,例如9+ 7 =16 ,carry 就是 1 ,sum就是6 ,然后它的赋值是这样赋值的。
cur.next = new ListNode(sum % 10);
于是这个 值就会存到 cur中 , 然后就是循环条件,它们分别是 L1向后推移一位 ,L2向后推移一位, cur向后推移一位。
当他们到顶了之后,此时跳出while 循环,看有没有进位1 ,如果有的话,还需要给cur 赋值一个最高位 1