剑指 Offer II 025. 链表中的两数相加

迭代

  1. 创建两个栈,分别将链表 1 和链表 2 都加入栈中
  2. 弹出栈计算即可得到正确的链表

反转链表

  1. 反转链表完成后,就是简单的大数相加问题
  1. /**
  2. * Definition for singly-linked list.
  3. * public class ListNode {
  4. * int val;
  5. * ListNode next;
  6. * ListNode() {}
  7. * ListNode(int val) { this.val = val; }
  8. * ListNode(int val, ListNode next) { this.val = val; this.next = next; }
  9. * }
  10. */
  11. class Solution {
  12. public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
  13. if (l1 == null || l2 == null) return l1 == null ? l2 : l1;
  14. ListNode newL1 = reverse(l1);
  15. ListNode newL2 = reverse(l2);
  16. int carry = 0;
  17. ListNode dummy = new ListNode(0);
  18. ListNode p = dummy;
  19. while (newL1 != null || newL2 != null) {
  20. int newVal = 0;
  21. newVal += newL1 == null ? 0 : newL1.val;
  22. newVal += newL2 == null ? 0 : newL2.val;
  23. newVal += carry;
  24. carry = newVal / 10;
  25. newVal = newVal % 10;
  26. p.next = new ListNode(newVal);
  27. p = p.next;
  28. newL1 = newL1 == null ? null : newL1.next;
  29. newL2 = newL2 == null ? null : newL2.next;
  30. }
  31. if (carry != 0) {
  32. p.next = new ListNode(carry);
  33. }
  34. return reverse(dummy.next);
  35. }
  36. private ListNode reverse(ListNode head) {
  37. ListNode prev = null, p = head;
  38. while (p != null) {
  39. ListNode next = p.next;
  40. p.next = prev;
  41. prev = p;
  42. p = next;
  43. }
  44. return prev;
  45. }
  46. }