两数相加
题目
解题思路及代码
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode ans = null, cur = null;//ans为新链表的头节点,cur用于创建后续节点
int remainder = 0;//判断是否需要进位,0表示没有进位,1表示有进位,且进位值为1
for (int sum, var; l1 != null || l2 != null; l1 = l1 != null ? l1.next : null, l2 = l2 != null ? l2.next : null) {
//sum表示当前两个链表相加的值,val为表示新链表当前位置的值(具体值在后续计算)
// l1 != null || l2 != null用于判断终止条件,当l1和l2都为null时,循环停止
//l1 = l1 != null ? l1.next : null, l2 = l2 != null ? l2.next : null
//l1和l2不断指向下一个节点,直至为null
sum = (l1==null?0:l1.val)+ (l2==null?0: l2.val)+remainder;
//计算两个链表相加后的值,如果某个链表已经指向null时为空,remainder为进位值(0/1)
var = sum % 10;//var为新链表当前位置的值,eg:l1当前为8,l2当前为6:sum=14,var=14%10=4
remainder = sum / 10;//remainder表示是否需要进位eg:sum=9,9/10=0不需要进位;sum=14 14/10=1,需要进位,进位值为1
if (ans == null){//如果新链表还为空
ans = new ListNode(var);//创建头节点,且头节点ans后续不需要移动,作为返回值最后返回
cur = ans;//cur指向ans并后续用于创建下一个节点
}else {//如果ans不是空链表
cur.next = new ListNode(var);//用cur.next创建下一个节点
cur = cur.next;//移动cur指向新节点
}
}
if (remainder==1){//两个链表都指向null时,判断前一步计算是否有进位,没有进位则返回ans。否则在新链表后加节点(值为1)
cur = new ListNode(1);
}
return ans;
}
}```