LeetCode刷题笔记-数据结构-day13
Posted LL.LEBRON
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode刷题笔记-数据结构-day13相关的知识,希望对你有一定的参考价值。
文章目录
LeetCode刷题笔记-数据结构-day13
25. K 个一组翻转链表
1.题目描述
原题链接:25. K 个一组翻转链表
2.解题思路
我们可以考虑分这几步:
- 增加虚拟头节点,方便后续操作
- 判断接下来的一段个数是否大于等于k
- 如果满足2,将这段进行反序
- 将倒序后的尾节点指向下一段的头节点
- 将p指针的next更新为倒序后的头部
- 更新p为倒序后的尾部,进行下一个反序操作
3.代码
class Solution
public:
ListNode* reverseKGroup(ListNode* head, int k)
ListNode* dummy=new ListNode(-1);
dummy->next=head;
for(auto p=dummy;;)
auto t=p;
//2
for(int i=0;i<k&&t;i++) t=t->next;
if(!t) break;
auto a=p->next,b=a->next;
//3
for(int i=0;i<k-1;i++)
auto c=b->next;
b->next=a;
a=b,b=c;
auto c=p->next;
//4
c->next=b;
//5
p->next=a;
//6
p=c;
return dummy->next;
;
143. 重排链表
1.题目描述
原题链接:143. 重排链表
2.解题思路
根据题目的意思我们可以用以下方法:
假设初始的链表是 L1→L2→L3→…→LnL1→L2→L3→…→Ln
。
- 将后半段的指针都反向,变成:
L1→L2→L3→…→L⌈n/2⌉←L⌈n/2⌉+1←…←Ln
- 用两个指针分别从1和n开始往中间扫描,将后半段交替插入到前半段,变成:
L1→Ln→L2→Ln−1→…
模拟,这里分几步:
- 先求出链表的总长度
- 然后将后半段链表反向
- 最后将后半段和前半段一起遍历,融入前半段
3.代码
class Solution
public:
void reorderList(ListNode* head)
int n=0;
//求出链表总长度
for(auto t=head;t;t=t->next) n++;
if(n<=2) return;
auto later=head;
//找出中心点
for(int i=0;i+1<(n+1)/2;i++) later=later->next;
auto a=later,b=a->next;
//将后半段翻转
while(b)
auto c=b->next;
b->next=a;
a=b,b=c;
later->next=nullptr;
//将后半段交替插入到前半段
while(head&&head!=a)
b=a->next;
a->next=head->next;
head->next=a;
head=head->next->next;
a=b;
;
以上是关于LeetCode刷题笔记-数据结构-day13的主要内容,如果未能解决你的问题,请参考以下文章