解法都在代码里,不懂就留言或者私信
/*** 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 {/**题目分析:这个题还是比较容易,应该属于简单题需要考虑的东西不多,因为题目本身就是给你的逆序的链表,我们按照从开始一直算下去,有进位就给上一位多个进位1就行不涉及链表的逆序问题,其他的东西我写在具体的代码的注释里 */public ListNode addTwoNumbers(ListNode l1, ListNode l2) {int carry = 0;/**结果链表的头节点 */ListNode head = null;/**结果链表遍历过的最后一个节点 */ListNode last = null;while(l1 != null && l2 != null) {/**进位之前的数 */int curSum = l1.val + l2.val + carry;/**当前节点的最终值(除了进位) */int curNum = curSum % 10;/**进位信息,其实就是有进位是1,没进位是0,没有其他的可能性 */carry = curSum / 10;ListNode curNode = new ListNode(curNum);if(head == null) {head = last = curNode;} else {/**跟之前的链表节点连接起来 */last.next = curNode;/**当前节点作为最后一个节点 */last = curNode;}/**切换到下个节点 */l1 = l1.next;l2 = l2.next;}/**上面的while退出的时候要么是两个都为null了,要么某个不为null,反正不会同时不为null,所以下面的while最终只能命中一个里面的逻辑几乎一样(和上面的while也几乎一样),实际编程中应该抽取成一个方法*/while(l1 != null) {int curSum = l1.val + carry;/**当前节点的最终值(除了进位) */int curNum = curSum % 10;/**进位信息,其实就是有进位是1,没进位是0,没有其他的可能性 */carry = curSum / 10;ListNode curNode = new ListNode(curNum);/**跟之前的链表节点连接起来 */last.next = curNode;/**当前节点作为最后一个节点 */last = curNode;l1 = l1.next;}while(l2 != null) {int curSum = l2.val + carry;/**当前节点的最终值(除了进位) */int curNum = curSum % 10;/**进位信息,其实就是有进位是1,没进位是0,没有其他的可能性 */carry = curSum / 10;ListNode curNode = new ListNode(curNum);/**跟之前的链表节点连接起来 */last.next = curNode;/**当前节点作为最后一个节点 */last = curNode;l2 = l2.next;}/**如果链表都过完了还有进位信息,新new一个节点作为最后一个节点 */if(carry != 0) {ListNode node = new ListNode(carry);last.next = node;}return head;}
}
运行结果: