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 单链表专题 (一)的更多相关文章

  1. LeetCode:链表专题

    链表专题 参考了力扣加加对与链表专题的讲解,刷了些 leetcode 题,在此做一些记录,不然没几天就没印象了 出处:力扣加加-链表专题 总结 leetcode 中对于链表的定义 // 定义方式1: ...

  2. leetcode 单链表相关题目汇总

      leetcode-19-Remove Nth From End of List—移除链表中倒数第n个元素 leetcode-21-Merge Two Sorted Lists—两个已排序链表归并 ...

  3. [LeetCode] Linked List Cycle II 单链表中的环之二

    Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Foll ...

  4. 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. ...

  5. [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 ...

  6. [LeetCode 206] Reverse Linked List 翻转单链表

    本题要求将给定的单链表翻转,是校招面试手撕代码环节的高频题,能很好地考察对单链表这一最简单数据结构的理解:可以使用迭代和递归两种方法对一个给定的单链表进行翻转,具体实现如下: class Soluti ...

  7. LeetCode刷题 链表专题

    链表专题 链表题目的一般做法 单链表的结构类型 删除节点 方法一 方法二 增加节点 LeedCode实战 LC19.删除链表的倒数第N个结点 解法思路 LC24.两两交换链表中的节点 解法思路 LC6 ...

  8. [算法][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 ...

  9. LeetCode Linked List Cycle II 单链表环2 (找循环起点)

    题意:给一个单链表,若其有环,返回环的开始处指针,若无环返回NULL. 思路: (1)依然用两个指针的追赶来判断是否有环.在确定有环了之后,指针1跑的路程是指针2的一半,而且他们曾经跑过一段重叠的路( ...

随机推荐

  1. Linux使用CFSSL自签TLS证书

    ⒈安装CFSSL wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 wget https://pkg.cfssl.org/R1.2/cfssljson ...

  2. bently addin 二次开发学习

    元素结构: 一些基本元素的添加与绘制: class CreateElement { public static void LineAndLineString() { Application app = ...

  3. osg做的路面项目

  4. multiwan 脚本

    以下为校区ACM实验室多拨脚本,使用了macvlan模块,具体策略路由和连接标记等思路就不解释了. #! /bin/bash getip() { |grep -o -e 'inet addr:[^ ] ...

  5. WPF 10天修炼 第四天- WPF布局容器

    WPF布局 WPF的窗口也就是Window类,是一个内容控件,该控件派生自ContentControl.内容控件有一个Content属性,该属性有一个限制,只能放置一个用户界面元素,或一个字符串.为了 ...

  6. 【原创】大数据基础之Logstash(5)监控

    有两种方式来监控logstash: api ui(xpack) When you run Logstash, it automatically captures runtime metrics tha ...

  7. docker容器和镜像的导入和导出

    镜像的保存 [root@wxtest1607 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE tomcat8 3.0 90457edaf6 ...

  8. Python IDLE配置清屏快捷键(Ctrl+L)

    1.在Python\Lib\idlelib下,新建一个ClearWindow.py文件(没有时就新建),内容如下: """ Clear Window Extension ...

  9. 树链剖分——线段树区间合并bzoj染色

    线段树区间合并就挺麻烦了,再套个树链就更加鬼畜,不过除了代码量大就没什么其他的了.. 一些细节:线段树每个结点用结构体保存,pushup等合并函数改成返回一个结构体,这样好写一些 struct Seg ...

  10. eclipse如何更换工作空间

    关于工作空间的更换,小生也操作较少,今天做个记录并分享给大家. 1.找到文件——更换工作空间——其他 2.选择自己要更换的工作空间点击确定即可.