当前位置:   article > 正文

[Leetcode] 合并两个有序数组、链表_合并两个有序链表不申请额外空间

合并两个有序链表不申请额外空间

1.合并两个有序数组

原地合并数组,即不使用额外的空间 --> 使用三个指针,从尾部往前处理

题目链接:https://leetcode.cn/problems/merge-sorted-array/

nums1 总长度 m+n,自身长度m;nums2 自身长度n, 使用三个指针,分别执行三个长度的最后

p1 初始指向 nums1有效长度的尾部,p3初始指向nums1的尾部

p2 初始指向 nums2的尾部

输入和最终的数组都是非递减排序,比较 p1 和 p2 所指元素大小,较大者的存到 p3 所指位置,然后指向较大者的指针 和 p3 往前移动一位

如果 p1 或 p2 有一个指针走到了数组的开头,该指针停止移动。之后省去比较步骤,继续把没走完的指针所指值依次存放到 p3 所指位置,同时二指针继续往前移动

Python3

  1. class Solution:
  2. def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
  3. """
  4. Do not return anything, modify nums1 in-place instead.
  5. """
  6. # 使用三个指针,分别执行三个长度的最后
  7. p1_tail, p2_tail = m - 1, n - 1
  8. tail = m + n - 1
  9. # p1 和 p2 分别遍历完各自的数组,循环才结束
  10. while p1_tail >= 0 or p2_tail >= 0:
  11. # 如果p1走到头
  12. if p1_tail == -1:
  13. nums1[tail] = nums2[p2_tail]
  14. p2_tail -= 1
  15. # 如果p2走到头
  16. elif p2_tail == -1:
  17. nums1[tail] = nums1[p1_tail]
  18. p1_tail -= 1
  19. # 如果p1位置的值大于p2位置的值,赋值、移动p1
  20. elif nums1[p1_tail] > nums2[p2_tail]:
  21. nums1[tail] = nums1[p1_tail]
  22. p1_tail -= 1
  23. # 如果p2位置的值大于p1位置的值,赋值、移动p2
  24. else:
  25. nums1[tail] = nums2[p2_tail]
  26. p2_tail -= 1
  27. # 上述选择分支已给 p3 所值位置赋值,此处往前移动 p3
  28. tail -= 1

2.合并两个有序链表

方法一:递归

方法二:虚拟一个起始节点 + 迭代

题目链接:https://leetcode.cn/problems/merge-two-sorted-lists/

方法一:虚拟一个prehead节点

从两个链表中不断找到较小者链上,最后返回 prehead.next

  1. # Definition for singly-linked list.
  2. class ListNode:
  3. def __init__(self, val=0, next=None):
  4. self.val = val
  5. self.next = next
  6. class Solution:
  7. def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
  8. if not list1:
  9. return list2
  10. elif not list2:
  11. return list1
  12. else:
  13. prehead = ListNode(-1)
  14. pre = prehead
  15. while list1 and list2:
  16. if list1.val < list2.val:
  17. pre.next = list1
  18. list1 = list1.next
  19. else:
  20. pre.next = list2
  21. list2 = list2.next
  22. pre = pre.next
  23. pre.next = list1 if list1 is not None else list2
  24. return prehead.next

方法二:递归

把问题转换为找到 list1 和 list2 头节点的较小者(将其指向后续的链表x),从 list1 或 list2 中抽离该节点,解决新链表和另一个链表的相同问题(假设得到链表 x)

  1. # Definition for singly-linked list.
  2. class ListNode:
  3. def __init__(self, val=0, next=None):
  4. self.val = val
  5. self.next = next
  6. class Solution:
  7. def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
  8. if not list1:
  9. return list2
  10. elif not list2:
  11. return list1
  12. else:
  13. if list1.val < list2.val:
  14. list1.next = self.mergeTwoLists(list1.next,list2)
  15. return list1
  16. else:
  17. list2.next = self.mergeTwoLists(list1,list2.next)
  18. return list2

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/编程革命者/article/detail/62938?site
推荐阅读
相关标签
  

闽ICP备14008679号