leecode25 k个一组翻转链表

题目:

给你一个链表,每k个节点一组进行反转,请你返回反转后的链表。
k是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是k的整数倍,那么请将最后剩余的节点保持原有顺序。
示例:

给定这个链表:1->2->3->4->5

当 k = 2 时,应当返回: 2->1->4->3->5

当 k = 3 时,应当返回: 3->2->1->4->5

思路一:

1、先将给定的链表存放到列表中去;
2、根据k的值进行切片、反转;
3、建立链表

代码:

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

class Solution:
    def reverseKGroup(self, head: ListNode, k: int) -> ListNode:
        if head == None:
            return head
        if k == 1:
            return head
        
        temp_list = []
        res = list1 = ListNode(0)
        point = head
        while point:
            temp_list.append(point.val)
            point = point.next
        if len(temp_list) < k:
            return head
        times = len(temp_list) // k
        for i in range(1, times + 1):
            temp = temp_list[(i - 1) * k: i * k]
            temp.reverse()
            for l in temp:
                list1.next = ListNode(l)
                list1 = list1.next
        i = times 
        if  len(temp_list) // k:
            temp = temp_list[i * k:]
            for l in temp:
                list1.next = ListNode(l)
                list1 = list1.next
        return res.next

结果:

执行用时 :72 ms, 在所有 Python3 提交中击败了70.99% 的用户
内存消耗 :15.3 MB, 在所有 Python3 提交中击败了5.15%的用户

思路二:(栈)这个速度简直太快了

1、我们把k个数压入栈中,然后弹出就是翻转的;
2、剩下的链表个数不够k个,将已翻转的部分与剩下链表连接

# Definition for singly_linked list
# class ListNode:
#		def _init__(self, x):
#			self.val = x
#			self.next = None

class Solution:
	def reverseKGroup(self, head,  k):
		dummy = ListNode(0)
		p = dummy
		while True:
			count = k
			stack = []
			tmp = head
			while count and tmp:
				stack.append(tmp)
				tmp = tmp.next
				count -= 1
			# 当剩下的链表个数不够k时跳出循环
			if count:
				p.next = head
				break
			# 翻转
			while stack:
				p.next = stack.pop()
				p = p.next
			# 将剩下链表连接
			p.next = tmp
			head = tmp
		return dummy.next

结果:

执行用时 :68 ms, 在所有 Python3 提交中击败了84.87% 的用户
内存消耗 :14.4 MB, 在所有 Python3 提交中击败了11.77%的用户

思路三:

递归

代码:

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

class Solution:
	def reverseKGroup(self, head, k):
		cur = head
		count = 0
		while cur and count != k:
			cur = cur.next
			count += 1
		if count == k:
			cur = self.reverseKGroup(cur, k)
			while count:
				tmp = head.next
				head.next = cur
				cur = head
				head = tmp
				count -= 1
			head = cur
		return head		

结果:

执行用时 :80 ms, 在所有 Python3 提交中击败了40.05% 的用户
内存消耗 :14.7 MB, 在所有 Python3 提交中击败了10.66%的用户

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值