LeetCode 单链表专题 (一)
LeetCode 单链表专题 <c++>
\([2]\) Add Two Numbers
模拟,注意最后判断进位是否为1。
时间复杂度 \(O(n)\)
class Solution {
public:
ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) {
ListNode ans(-1);
int carry = 0;
auto p1 = l1, p2 = l2;
auto p = &ans;
while (p1 != nullptr || p2 != nullptr) {
int val1, val2;
if (p1 == nullptr) { val1 = 0; }
else {
val1 = p1->val;
p1 = p1->next;
}
if (p2 == nullptr) { val2 = 0; }
else {
val2 = p2->val;
p2 = p2->next;
}
int sum = (val1 + val2 + carry) % 10;
carry = (val1 + val2 + carry) / 10;
p = p->next = new ListNode(sum);
}
if(carry) p->next = new ListNode(carry);
return ans.next;
}
};
\([92]\) Reverse Linked List II
给定链表,翻转第m个结点到第n个结点。
从第m+1个结点开始,在第m-1个结点之后的位置用头插法插入新结点,可以避免使用栈。
时间复杂度 \(O(n)\)
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) {
ListNode res(-1);
auto p = head, p_res = &res;
for(int i = 1; i <= m-1; i++){
p_res = p_res->next = new ListNode(p->val); // new list next node
p = p->next; // origin list next node
}
auto prev = p_res;
p_res = p_res->next = new ListNode(p->val);
auto last = p_res;
p = p->next;
for(int i = m+1; i <= n; i++){
prev->next = new ListNode(p->val);
prev->next->next = p_res;
p_res = prev->next;
p = p->next;
}
last->next = p;
return res.next;
}
};
\([86]\) Partition List
链表拼接。
时间复杂度 \(O(n)\)
(c++)搞清楚了实体用.,指针用->调用属性和方法。
(c++)new 构造方法(参数)返回的是同类型指针。
class Solution {
public:
ListNode* partition(ListNode* head, int x) {
ListNode dummy_l(-1);
ListNode dummy_r(-1);
auto dummy_l_p = &dummy_l, dummy_r_p = &dummy_r;
for(auto p = head; p; p = p->next){
if(p->val<x){
dummy_l_p = dummy_l_p->next = p;
}
else {
dummy_r_p = dummy_r_p->next = p;
}
}
dummy_l_p->next = dummy_r.next;
dummy_r_p->next = nullptr;
return dummy_l.next;
}
};
\([82]\) Remove Duplicates from Sorted List II
如果有元素重复出现,删掉该元素及其复制。
时间复杂度 \(O(n)\)
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
ListNode dummy(-1);
auto prev = &dummy;
bool flag = false;
for(auto p = head; p; p = p->next){
while(p->next!=nullptr && p->next->val == p->val){
p->next = p->next->next;
flag = true;
}
if(flag){
flag = false;
prev->next = p->next;
}
else prev = prev->next = p;
}
return dummy.next;
}
};
\([61]\) Rotate List
先遍历求出长度length。k可能大于等于length,所以对length取模。从length-k处断开原链表,断开处为新链表头结点,原头结点接到原尾结点后面。
时间复杂度 \(O(n)\)
class Solution {
public:
ListNode* rotateRight(ListNode* head, int k) {
if(head == nullptr) return head;
int length = 1;
auto cur = head;
for(; cur->next; cur = cur->next) length++;
k = k % length;
if(k == 0) return head;
ListNode dummy(-1);
dummy.next = head;
auto cut = &dummy;
for(int i = 0; i<length - k; i++) cut = cut->next;
dummy.next = cut->next;
cur->next = head;
cut->next = nullptr; // 记得断开,避免形成环,会TLE。
return dummy.next;
}
};
\([19]\) Remove Nth Node From End of List
删掉链表倒数第n个结点,要求只遍历一遍。
两个指针p,q。一个先走n步,然后两个一起走。
时间复杂度 \(O(n)\)
/**
* Status: Accepted
* Runtime: 12 ms
*/
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode dummy(-1);
dummy.next = head;
auto p = &dummy, q = &dummy;
int cnt = 0;
while(p!=nullptr) {
if(cnt>n) q = q->next;
p = p->next;
cnt++;
}
q->next = q->next->next;
return dummy.next;
}
};
这份代码跑了12ms。因为循环中有判断语句。
下面是优化后的代码
/**
* Status: Accepted
* Runtime: 8 ms
*/
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode dummy(-1);
dummy.next = head;
auto p = &dummy, q = &dummy;
for(int i = 0; i<=n; i++) p = p->next;
while(p!=nullptr) {
q = q->next;
p = p->next;
}
auto tmp = q->next;
q->next = q->next->next;
delete tmp;
return dummy.next;
}
};
LeetCode 单链表专题 (一)的更多相关文章
- LeetCode:链表专题
链表专题 参考了力扣加加对与链表专题的讲解,刷了些 leetcode 题,在此做一些记录,不然没几天就没印象了 出处:力扣加加-链表专题 总结 leetcode 中对于链表的定义 // 定义方式1: ...
- leetcode 单链表相关题目汇总
leetcode-19-Remove Nth From End of List—移除链表中倒数第n个元素 leetcode-21-Merge Two Sorted Lists—两个已排序链表归并 ...
- [LeetCode] Linked List Cycle II 单链表中的环之二
Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Foll ...
- LeetCode 笔记系列六 Reverse Nodes in k-Group [学习如何逆转一个单链表]
题目:Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. ...
- [LeetCode] 142. Linked List Cycle II 单链表中的环之二
Given a linked list, return the node where the cycle begins. If there is no cycle, return null. To r ...
- [LeetCode 206] Reverse Linked List 翻转单链表
本题要求将给定的单链表翻转,是校招面试手撕代码环节的高频题,能很好地考察对单链表这一最简单数据结构的理解:可以使用迭代和递归两种方法对一个给定的单链表进行翻转,具体实现如下: class Soluti ...
- LeetCode刷题 链表专题
链表专题 链表题目的一般做法 单链表的结构类型 删除节点 方法一 方法二 增加节点 LeedCode实战 LC19.删除链表的倒数第N个结点 解法思路 LC24.两两交换链表中的节点 解法思路 LC6 ...
- [算法][LeetCode]Linked List Cycle & Linked List Cycle II——单链表中的环
题目要求 Linked List Cycle Given a linked list, determine if it has a cycle in it. Follow up: Can you so ...
- LeetCode Linked List Cycle II 单链表环2 (找循环起点)
题意:给一个单链表,若其有环,返回环的开始处指针,若无环返回NULL. 思路: (1)依然用两个指针的追赶来判断是否有环.在确定有环了之后,指针1跑的路程是指针2的一半,而且他们曾经跑过一段重叠的路( ...
随机推荐
- 转:Spring历史版本变迁和如今的生态帝国
Spring历史版本变迁和如今的生态帝国 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/bntX2jSQfEHy7/article/deta ...
- Ubuntu版本linux系统安装git
可以使用apt-get方式安装,也可以下载源代码安装,我们这里使用apt-git安装.但由于直接使用 sudo apt-get install git 安装的版本较老,因此我们参考[2]中给出的PPA ...
- MSYS 编译 nginx rtmp-module
1. 下载源码 http://hg.nginx.org/nginx nginx-c74904a17021.zip https://github.com/arut/nginx-rtmp-module n ...
- MAC本apache+php配置虚拟域名时踩的坑
昨天在调试Mac自带的Apache+PHP配置域名时,调试的让我怀疑人生.顿时心里一万个草泥马,我就是配置个虚拟域名啊,这么让我受伤 . 1 首先检查一下Apache是否开启, qutao@bogon ...
- web文件下载
web页面实现文件下载的几种方法 今天碰到文件下载的一些问题,本着知其然也要知其所以然的精神,站在巨人的肩膀上深入学习和测试了一下,抛砖引玉,现在总结结论如下: 1)标准URL下载方式可以通过在web ...
- arm寄存器
ARM 处理器拥有 37 个寄存器. 这些寄存器按部分重叠组方式加以排列. 每个处理器模式都有一个不同的寄存器组. 编组的寄存器为处理处理器异常和特权操作提供了快速的上下文切换. 提供了下列寄存器:三 ...
- linux 相关( 随时更新)
Linux笔记: 本地文件传到服务器上: scp -P8022 /文件路径 niehaidong@101.201.75.57:/tmp/ 从服务器上到本地 scp -P8022 niehaidong ...
- U盘安装Mac OS X要点
1.启动U盘必须比系统磁盘小,因为制作启动U盘,U盘很可能被当成系统盘.系统安装时,发现系统盘比U盘小,很可能提示安装失败. 2.制作启动U盘.详情查看官网:https://support.apple ...
- Filebeat+Kafka+Logstash+ElasticSearch+Kibana搭建完整版
1. 了解各个组件的作用 Filebeat是一个日志文件托运工具,在你的服务器上安装客户端后,filebeat会监控日志目录或者指定的日志文件,追踪读取这些文件(追踪文件的变化,不停的读) Kafka ...
- php unicode编码和字符串互转
php字符串转Unicode编码, Unicode编码转php字符 百度了很多,都一样, 要么不对, 要不就是只是把字符串的汉字转Unicode 经过多次试验查找, 找到了如下方法, 注意:字符串编码 ...