牛客网高频算法题系列-BM11-链表相加(二)

题目描述

假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。给定两个这种链表,请生成代表两个整数相加值的结果链表。

原题目见:BM11 链表相加(二)

解法一:使用栈

首先,特殊情况判断:

  • 如果链表一为空,则直接返回链表二
  • 如果链表二为空,则直接返回链表一

否则,使用2个栈用来存放两个链表的结点:

  • 首先将两个链表中的结点添加到栈中;
  • 遍历2个栈,即执行加法,将值添加到新的栈中这样可以按倒序进行结点值相加,其中需要使用一个变量记录进位值;
  • 需要注意的是,遍历结束后,需要根据进位值判断是否需要添加额外的结点;
  • 最后,根据新的栈构造相加后的链表并返回之。

如果不想使用多余的栈空间,可以考虑先将两个链表倒序排列后,再执行加法。

代码

  1. import java.util.Stack;
  2. public class Bm011 {
  3. /**
  4. * 链表相加:使用栈
  5. *
  6. * @param head1 ListNode类
  7. * @param head2 ListNode类
  8. * @return ListNode类
  9. */
  10. public static ListNode addInList(ListNode head1, ListNode head2) {
  11. // 如果链表一为空,则直接返回链表二
  12. if (head1 == null) {
  13. return head2;
  14. }
  15. // 如果链表二为空,则直接返回链表一
  16. if (head2 == null) {
  17. return head1;
  18. }
  19. // 2个栈用来存放两个链表的结点
  20. Stack<ListNode> nodes1 = new Stack<>();
  21. Stack<ListNode> nodes2 = new Stack<>();
  22. while (head1 != null) {
  23. nodes1.push(head1);
  24. head1 = head1.next;
  25. }
  26. while (head2 != null) {
  27. nodes2.push(head2);
  28. head2 = head2.next;
  29. }
  30. // 记录进位值
  31. int addOne = 0;
  32. Stack<Integer> newNodes = new Stack<>();
  33. // 遍历栈,即执行加法,将值添加到新的栈中
  34. while (!nodes1.isEmpty() || !nodes2.isEmpty()) {
  35. int val1 = 0, val2 = 0, newVal = 0;
  36. if (!nodes1.isEmpty()) {
  37. val1 += nodes1.pop().val;
  38. }
  39. if (!nodes2.isEmpty()) {
  40. val2 += nodes2.pop().val;
  41. }
  42. newVal += addOne + val1 + val2;
  43. if (newVal > 9) {
  44. newVal = newVal % 10;
  45. addOne = 1;
  46. } else {
  47. addOne = 0;
  48. }
  49. newNodes.push(newVal);
  50. }
  51. if (addOne == 1) {
  52. newNodes.push(1);
  53. }
  54. ListNode newHead = new ListNode(-1);
  55. ListNode next = newHead;
  56. while (!newNodes.isEmpty()) {
  57. next.next = new ListNode(newNodes.pop());
  58. next = next.next;
  59. }
  60. return newHead.next;
  61. }
  62. public static void main(String[] args) {
  63. // 链表一: 1 -> 3 -> 5
  64. ListNode head1 = ListNode.testCase3();
  65. // 链表二: 2 -> 4 -> 6
  66. ListNode head2 = ListNode.testCase4();
  67. // 测试用例,期望输出: 3 -> 8 -> 1
  68. ListNode.print(addInList(head1, head2));
  69. }
  70. }

牛客网高频算法题系列-BM11-链表相加(二) - 图1
牛客网高频算法题系列-BM11-链表相加(二) - 图2
相信坚持的力量!