题目梗概:
public class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
有两个链表,它们节点的数据结构如上所示,其中val存储小于10的正整数,next指向链表的下一个节点。现在要遍历这两个链表,将它们的节点的val分别相加并组成新的链表,规定新的链表的节点的val由这两个链表的节点的val相加后决定,如果相加后小于10,则val的值等于相加后的数,如果相加后大于10,则val的值等于相加后的数的个位,并将进位传递到下一个节点的相加中,返回新的链表的第一个节点。
解题思路:
这道题考验的是对链表的认识和正确的赋值。解题的Demo示意图如下所示,需要注意的是两个链表很可能是不一样大小的,因此在遍历时需要注意对链表节点进行非空判断,且当遍历完成后,考虑到最后一次节点的相加中很可能出现进位的情况,因此也要进行相应的处理。
解题算法:
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode first = new ListNode(0);
ListNode curr = first;
int carry = 0;
while(l1!=null||l2!=null){
int v1 = l1!=null?l1.val:0;
int v2 = l2!=null?l2.val:0;
int sum = v1 + v2 + carry;
curr.next = new ListNode(sum%10);
curr = curr.next;
carry = sum/10;
if(l1!=null){
l1 = l1.next;
}
if(l2!=null){
l2 = l2.next;
}
}
if(carry!=0){
curr.next=new ListNode(carry);
}
return first.next;
}
}
测试用例
public static void main(String[] args) {
ListNode first1 = new ListNode(2);
ListNode l1 = first1;
l1.next = new ListNode(4);
l1 = l1.next;
l1.next = new ListNode(3);
ListNode first2 = new ListNode(5);
ListNode l2 = first2;
l2.next = new ListNode(6);
l2 = l2.next;
l2.next = new ListNode(4);
for (ListNode n = addTwoNumbers(first1, first2); n != null; n = n.next) {
System.out.println(n.val);
}
}