• 算法题练习——JS Node+python题解合并k个已排序的链表及链表的奇偶重排


    CSDN编程竞赛报名地址:https://edu.csdn.net/contest/detail/16 


            这次CSDN 的编程竞赛的题目相对很简单,四道编程题不用半小时就可以全部ak,9-18号11点前都能进行报名,得奖后有丰厚的奖励等你拿。错过的朋友可以等下一期。

            本文给大家分享一道我在其他的编程比赛中遇到的一道链表题目,是不需要自己输入输出的,反倒让我刚开始有些无从下手,借故分享给大家,第二道也是正常的链表题,也呈现给大家。


    目录

    合并k个已排序的链表

    链表的奇偶重排

    总结 


    合并k个已排序的链表

    描述

    合并 k 个升序的链表并将结果作为一个升序的链表返回其头节点。

    数据范围:节点总数满足0≤n≤10^5,链表个数满足1≤k≤10^5,每个链表的长度满足1≤len≤200  ,每个节点的值满足∣val∣<=1000;

    要求:时间复杂度 O(nlogk)O(nlogk)

    示例1

    输入:[{1,2,3},{4,5,6,7}]

    返回值:{1,2,3,4,5,6,7}

    示例2

    输入:[{1,2},{1,4,5},{6}]

    返回值:{1,1,2,4,5,6}

    JavaScript题解:

    1. /*
    2. * function ListNode(x){
    3. * this.val = x;
    4. * this.next = null;
    5. * }
    6. */
    7. /**
    8. *
    9. * @param lists ListNode类一维数组
    10. * @return ListNode类
    11. */
    12. function mergeKLists( lists ) {
    13. // write code here
    14. if(!lists) return null
    15. let listsval = []
    16. for(let i=0;ilength;i++){
    17. while(lists[i]){
    18. listsval.push(lists[i].val)
    19. lists[i] = lists[i].next
    20. }
    21. }
    22. listsval.sort((a,b)=>a-b)
    23. let head = new ListNode(0)
    24. let cur = head
    25. listsval.forEach(item=>{
    26. cur.next = new ListNode(item);
    27. cur = cur.next
    28. })
    29. return head.next
    30. }
    31. module.exports = {
    32. mergeKLists : mergeKLists
    33. };

    python不用输入输出题解:

    1. # class ListNode:
    2. # def __init__(self, x):
    3. # self.val = x
    4. # self.next = None
    5. #
    6. # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
    7. #
    8. #
    9. # @param lists ListNode类一维数组
    10. # @return ListNode类
    11. #
    12. class Solution:
    13. def mergeKLists(self , lists: List[ListNode]) -> ListNode:
    14. # write code here
    15. if not lists:
    16. return None
    17. listNodeList = []
    18. listValList = []
    19. for head in lists:
    20. while head:
    21. listNodeList.append(head)
    22. listValList.append(head.val)
    23. head = head.next
    24. listValList = sorted(listValList)
    25. head = listNodeList[0]
    26. for i in range(len(listValList)-1):
    27. cur = listNodeList[i]
    28. nex = listNodeList[i+1]
    29. cur.val = listValList[i]
    30. nex.val = listValList[i+1]
    31. cur.next = nex
    32. return head

    python自己输入输出题解:

    1. link_list = input()
    2. link_list = link_list.replace('[', '')
    3. link_list = link_list.replace(']', '')
    4. link_list = link_list.replace('{', '')
    5. link_list = link_list.replace('}', '')
    6. link_list = link_list.split(',')
    7. if link_list[0] == '':
    8. print('{}')
    9. else:
    10. nums = []
    11. for each in link_list:
    12. if each == '':
    13. continue
    14. nums.append(int(each))
    15. res = '{' + ','.join(map(str, sorted(nums))) + '}'
    16. print(res)

    链表的奇偶重排

     描述

            给定一个单链表,请设定一个函数,将链表的奇数位节点和偶数位节点分别放在一起,重排后输出。

    注意是节点的编号而非节点的数值。

    数据范围:节点数量满足 0≤n≤10^5,节点中的值都满足0≤val≤1000

    要求:空间复杂度 O(n),时间复杂度 O(n)

    示例1

    输入:{1,2,3,4,5,6}

    返回值:{1,3,5,2,4,6}

    说明:

    1->2->3->4->5->6->NULL

    重排后为

    1->3->5->2->4->6->NULL

    示例2

    输入:{1,4,6,3,7}

    返回值:{1,6,7,4,3}

    说明:

    1->4->6->3->7->NULL

    重排后为

    1->6->7->4->3->NULL
    奇数位节点有1,6,7,偶数位节点有4,3。重排后为1,6,7,4,3

    解析:

    • step 1:判断空链表的情况,如果链表为空,不用重排。
    • step 2:使用双指针odd和even分别遍历奇数节点和偶数节点,并给偶数节点链表一个头。
    • step 3:上述过程,每次遍历两个节点,且even在后面,因此每轮循环用even检查后两个元素是否为NULL,如果不为再进入循环进行上述连接过程。
    • step 4:将偶数节点头接在奇数最后一个节点后,再返回头部。

    JavaScript题解:

    1. /*
    2. * function ListNode(x){
    3. * this.val = x;
    4. * this.next = null;
    5. * }
    6. */
    7. /**
    8. * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
    9. *
    10. *
    11. * @param head ListNode类
    12. * @return ListNode类
    13. */
    14. function oddEvenList( head ) {
    15. // write code here
    16. if(!head)return
    17. let even = head.next
    18. let odd = head
    19. let evenhead =even
    20. while(even&&even.next){
    21. odd.next = even.next
    22. odd = odd.next
    23. even.next = odd.next
    24. even = even.next
    25. }
    26. odd.next = evenhead
    27. return head
    28. }
    29. module.exports = {
    30. oddEvenList : oddEvenList
    31. };

    Python题解: 

    1. class Solution:
    2. def oddEvenList(self , head: ListNode) -> ListNode:
    3. #如果链表为空,不用重排
    4. if head == None:
    5. return head
    6. #even开头指向第二个节点,可能为空
    7. even = head.next
    8. #odd开头指向第一个节点
    9. odd = head
    10. #指向even开头
    11. evenhead = even
    12. while even and even.next:
    13. #odd连接even的后一个,即奇数位
    14. odd.next = even.next
    15. #odd进入后一个奇数位
    16. odd = odd.next
    17. #even连接后一个奇数的后一位,即偶数位
    18. even.next = odd.next
    19. #even进入后一个偶数位
    20. even = even.next
    21. #even整体接在odd后面
    22. odd.next = evenhead
    23. return head

    总结 

            程序员写代码并不是从0开始的,我们也是需要借助多个模板拼接,使得代码能够实现我们的想法,而且也并非默写出来,毕竟学习编程是开卷学习,开卷使用,写程序也是一样的,我们写完程序都需要去借鉴一下他人的作品,争取提升自己代码的质量,优化算法,才能使我们不断进步!!!

  • 相关阅读:
    【Java每日一题】——第三十三题:思考应用题(2023.10.17)
    【EI会议征稿】第三届机械、建模与材料工程国际学术会议(I3ME 2023)
    Linux常用环境Docker安装
    快速入门Spring Cloud OpenFeign
    MySQL【第一章】——入门级
    ARMv8平台上安装QT开发环境
    代码随想录第35天 | ● 62.不同路径 ● 63. 不同路径 II
    亚马逊个人漂浮装置UL 1177测试报告审核申请
    【zip密码】zip压缩包删除密码方法
    sqlite 操作记录。
  • 原文地址:https://blog.csdn.net/weixin_53919192/article/details/126805913