题目描述:

将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
**示例:

  1. 输入:1->2->4, 1->3->4
  2. 输出:1->1->2->3->4->4

算法实现:

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 mergeTwoLists = function(l1, l2) {
  14. if(l1 === null){
  15. return l2
  16. }
  17. if(l2 === null){
  18. return l1
  19. }
  20. if(l1.val < l2.val){
  21. l1.next = mergeTwoLists(l1.next, l2)
  22. return l1
  23. }else{
  24. l2.next = mergeTwoLists(l1, l2.next)
  25. return l2
  26. }
  27. };

暴力法

  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 mergeTwoLists = function(l1, l2) {
  14. var listToArray = (list) => {
  15. if(list == null) {
  16. return []
  17. } else if(list.next) {
  18. return [list.val, ...listToArray(list.next)]
  19. } else {
  20. return [list.val]
  21. }
  22. }
  23. var arrSort = (arr) => {
  24. arr.sort((a, b) => a - b)
  25. return arr
  26. }
  27. var arrayToList = (arr) => {
  28. if(arr.length > 0) {
  29. let node = new ListNode(arr.shift())
  30. node.next = arrayToList(arr)
  31. return node
  32. } else {
  33. return null
  34. }
  35. }
  36. return arrayToList(arrSort([...listToArray(l1),...listToArray(l2)]))
  37. };

思路:

通过递归逐位比较大小,最终返回链表。
暴力法采用链表转数组再转链表的方法
总结:
这道题目进一步加深了我对链表的理解。