合并K个排序链表

K 个一组翻转链表

最近刷leetcode和做字节跳动遇到K 个一组翻转链表问题。
整体思路分为两个任务,首先是将整个链表分成K段,

  1. 段内进行重新排序
  2. 段间进行重新链接

leetcode
为了让代码实现上述过程的循环,需要得到每段前后的结点信息。(关键)

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None


class ListNode(object):
    def __init__(self, x):
        self.val = x
        self.next = None

class Solution(object):
    def reverseK(self,head,tail):
        after = tail.next
        pre = head
        while after != tail:
            temp = pre.next
            pre.next = after
            after = pre
            pre =temp
        return tail,head

    def reverseKGroup(self, head, k):
        """
        :type head: ListNode
        :type k: int
        :rtype: ListNode
        """
        sky = ListNode(0)
        sky.next  = head
        pre = sky

        while head != None:
            tail = pre
            for i in range(k):
                tail = tail.next
                if not tail:
                    return sky.next
            nex = tail.next
            head,tail = self.reverseK(head,tail)
            pre.next = head
            tail.next = nex
            pre = tail
            head = tail.next
        return sky.next

在这里插入图片描述
总结:难点在于每段连接时构造清楚上一段的尾部结点指针和下一段的头部结点。

reference

https://leetcode-cn.com/problems/reverse-nodes-in-k-group/添加链接描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值