import java.util.*; /* * public class ListNode { * int val; * ListNode next = null; * public ListNode(int val) { * this.val = val; * } * } */ public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param l1 ListNode类 * @param l2 ListNode类 * @return ListNode类 */ public ListNode addEnergyValues (ListNode l1, ListNode l2) { ListNode head = null, tail = null; // 进位数 int carry = 0; while (l1 != null || l2 != null) { // 哪个节点不为null那么就有值,否则默认为0 int n1 = l1 != null ? l1.val : 0; int n2 = l2 != null ? l2.val : 0; // sum==节点的值相加+进位数 int sum = n1 + n2 + carry; // 计算两个数的和,排除超过10的情况,超过10取余数 if (head == null) { head = tail = new ListNode(sum % 10); } else { tail.next = new ListNode(sum % 10); tail = tail.next; } // 计算进位数 carry = sum / 10; // l1不为null,节点后移 if (l1 != null) { l1 = l1.next; } // l2不为null,节点后移 if (l2 != null) { l2 = l2.next; } } // 如果最后两个数相加还有进位数,将进位数赋给链表的新结点 if (carry > 0) { tail.next = new ListNode(carry); } // 返回链表头结点 return head; } }
本题知识点分析:
1.前驱结点和后继结点
2.链表遍历和赋值
3.数学模拟
本题解题思路分析:
1.将两个链表看成是相同长度的进行遍历,如果一个链表较短则在前面补 0,比如564+23=564+023=587.
2.每一位计算的同时需要考虑上一位的进位问题,而当前位计算结束后同样需要更新进位值
3.如果两个链表全部遍历完毕后,进位值为 111,则在新链表最前方添加节点 111