这道题有两种解法:
- 利用栈的先进后出原则实现加法,将链表数据入栈,栈顶为低位。这里采用头插法(新的node插在前面)来使链表逆序。
/** * 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 { public ListNode addTwoNumbers(ListNode l1, ListNode l2) { Stack<Integer> stack1 = new Stack(); Stack<Integer> stack2 = new Stack(); while(l1 != null){ stack1.push(l1.val); l1 = l1.next; } while(l2 != null){ stack2.push(l2.val); l2 = l2.next; } int carry = 0; ListNode head = null; while(!stack1.isEmpty() || !stack2.isEmpty() || carry > 0){ int sum = carry; if(!stack1.isEmpty()){ sum += stack1.pop(); } if(!stack2.isEmpty()){ sum += stack2.pop(); } ListNode d = new ListNode(sum % 10); carry = sum / 10; d.next = head; head = d; } return head; } }
- 先reverse两个list,然后逐位相加,再reverse得到的list,这就是我们想要的结果·。
/** * 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 { public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode r1 = reverse(l1); ListNode r2 = reverse(l2); ListNode dummy = new ListNode(); ListNode digit = dummy; int carry = 0; while(r1 != null || r2 != null){ int sum = carry; if(r1 != null){ sum += r1.val; r1 = r1.next; } if(r2 != null){ sum += r2.val; r2 = r2.next; } digit.next = new ListNode(sum % 10); digit = digit.next; carry = sum / 10; } if(carry > 0){ digit.next = new ListNode(1); } return reverse(dummy.next); } private ListNode reverse(ListNode head){ ListNode prev = null; ListNode curr = head; while(curr != null){ ListNode next = curr.next; curr.next = prev; prev = curr; curr = next; } return prev; } }