昨天转载了篇关于递归算法的解读文,很佩服可以透彻掌握算法又能信手拈来做讲解。反思之前我刷题的记录,像是记流水账、没太多营养,所以希望有时间的话能继续深挖下算法,也能加深自己的理解。
今天要刷的两道题,第一个是昨天链表交换节点的升级版的困难级别题目,第二个是对数组去重的简单级别题目。本着能做完就算过关的态度,我先分享自己的尝试,再来观摩题解区可借鉴的思路。
题目一
第 25 题:K 个一组翻转链表
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
示例:
给你这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
#来源:力扣(LeetCode)
#链接:https://leetcode-cn.com/problems/reverse-nodes-in-k-group
说明:
你的算法只能使用常数的额外空间。你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
尝试思路
最初是想就着昨天那个能够两两交换节点的递归算法来实现,尝试半天没能写出来,只好先降低难度来解决了。因为对链表不好操作,我们不妨把链表就转化为数字组成的列表,题目也就转化为了将列表中的元素每 k 个进行一翻转:
输入:[1,2,3,4,5]
k = 2 时,输出:[2,1,4,3,5]
k = 3 时,输出:[3,2,1,4,5]
最后再将翻转后的列表按顺序生成链表即可。至于每 k 个元素一翻转,这个过程我是靠列表切片实现的。
比如 lst = [1,2,3,4,5] 列表中,我们可以通过 lst[0] 取其中第一个元素 1,也可以通过切片 lst[2:4] 对列表切片提取其中的第三、四位元素组成的列表。
切片的格式是“列表[起始位置:结束位置:步长]”,起始位置默认为 0、结束位置默认为列表长度值、步长默认为1,lst[:] 即省略掉三者,即 lst 所有元素,lst[::-1] 则将步长调整为 -1,可以实现对列表的翻转或逆向提取得到 [5,4,3,2,1]。