解:
同时遍历两个链表,直至两个都遍历完结位置(当前节点为空时,值按0处理),两节点值及进位值相加并得出进位、和,赋值给当前新节点,以生成结果链表。
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode cur = new ListNode();
ListNode pre = cur;
int carry = 0;
while (l1 != null || l2 != null) {
int n1 = (l1 == null ? 0 : l1.val);
int n2 = (l2 == null ? 0 : l2.val);
int num = (n1 + n2 + carry) % 10;
carry = (n1 + n2 + carry) / 10;
if (l1 != null) {
l1 = l1.next;
}
if (l2 != null) {
l2 = l2.next;
}
cur.val = num;
if (l1 != null || l2 != null) {
cur.next = new ListNode();
cur = cur.next;
}
}
if (carry != 0) {
cur.next = new ListNode(carry);
}
return pre;
}
我的思路是先建好当前新节点,计算后将结果赋值过来并且新建下一个节点并移动。(先走再赋值)
这种思路会多一步判断(否则不论最后是否需要进位,链表都会新创建一个节点,导致结果错误)。
如果思路换成头结点与其余节点分开考虑,即除了第一个节点,剩余都是在计算下一个节点的数值,再赋值、移动,可省去判断。(先赋值再走)
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode head = null, tail = null;
int carry = 0;
while (l1 != null || l2 != null) {
int n1 = l1 != null ? l1.val : 0;
int n2 = l2 != null ? l2.val : 0;
int sum = n1 + n2 + carry;
if (head == null) {
head = tail = new ListNode(sum % 10);
} else {
tail.next = new ListNode(sum % 10);
tail = tail.next;
}
carry = sum / 10;
if (l1 != null) {
l1 = l1.next;
}
if (l2 != null) {
l2 = l2.next;
}
}
if (carry > 0) {
tail.next = new ListNode(carry);
}
return head;
}
}