题目描述:

给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
**示例 1

  1. 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
  2. 输出:7 -> 0 -> 8
  3. 原因:342 + 465 = 807

算法实现:

JavaScript

  1. /**
  2. * Definition for singly-linked list.
  3. * function ListNode(val) {
  4. * this.val = val;
  5. * this.next = null;
  6. * }
  7. */
  8. /**
  9. * @param {ListNode} l1
  10. * @param {ListNode} l2
  11. * @return {ListNode}
  12. */
  13. var addTwoNumbers = function(l1, l2) {
  14. var listToArray = (list) => {
  15. if(list.next) {
  16. return [list.val, ...listToArray(list.next)]
  17. } else {
  18. return [list.val]
  19. }
  20. }
  21. var addArray = (arr1,arr2) => {
  22. if(arr1.length < arr2.length) {
  23. var arr = []
  24. arr = arr1
  25. arr1 = arr2
  26. arr2 = arr
  27. }
  28. for(var i = 0; i < arr2.length; i++) {
  29. arr1[i] += arr2[i]
  30. }
  31. for(var i = 0; i < arr1.length; i++ ) {
  32. if(arr1[i] >= 10) {
  33. arr1[i] -= 10
  34. arr1[i + 1] ? arr1[i + 1]++ : arr1[i+1] = 1
  35. }
  36. }
  37. return arr1.reverse()
  38. }
  39. var arrayToList = (arr) => {
  40. if(arr.length > 0) {
  41. let node = new ListNode(arr.pop())
  42. node.next = arrayToList(arr)
  43. return node
  44. } else {
  45. return null
  46. }
  47. }
  48. return arrayToList(addArray(listToArray(l1),listToArray(l2)))
  49. };

思路

这是一道对于链表进行操作的题目,但是我们对于链表并不是很熟悉,由此我想通过把链表转化为数组进行操作之后,再转化为链表进行解题。
所以,第一步通过扩展运算符和递归调用可以把链表转化为数组,之后在数组中进行题目要求的算法操作,最后,再将数组转化回链表,完成题目。

总结

通过这道题目,可以加深我们对链表的了解以及对数组的操作,我在实际操作的过程中,在数组转化为链表的步骤中出现了代码错误,在算法设计过程中出现了多次逻辑上的错误,通过查资料和借鉴别人的代码完成了这次作业。完成了人生中的第一道算法题目,再接再厉!