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. Python Cookbook 数据结构和算法

    1.查找最大或最小的N个元素 import heapq nums = [1, 8, 2, 23, 7, -4, 18, 23, 42, 37, 2] print(heapq.nlargest(3, n ...

  2. 使用Promise发送多个异步请求, 全部完成后再执行

    const datas = idList .map(id => url+'/id') .map(url => fetch(url).then(res => res.json())); ...

  3. PC设置局域网打印机

    打印机采用局域网网络连接方式,下面以Windows系统为例说明如何添加此打印机. 将电脑接入局域网 在“控制面板”中打开“设备与打印机”,点击“添加打印机” 在弹出列表中,会自动出现打印机型号,选中它 ...

  4. day13 Python数据基本类型

    算数运算 / x除以y // 取整除 %返回除法的余数 !=   不等于 <> 不等于 赋值运算 c+= a等价于c=c+a c-= a等价于c=c-a 逻辑运算 and or not 基 ...

  5. Django-ORM-单表操作

    ORM字段参数及单表操作 一.字段参数 1.字段 AutoField(Field) #当model中如果没有自增列,则会自动创建一个列名为id的列 -int 自增列,必须填入参数primary_key ...

  6. 解决springboot启动失败问题:Unable to start embedded container;

    将一个springboot项目导入到eclipse后,启动时报错Unable to start embedded container,以下时全部错误信息: Application startup fa ...

  7. Java入门细则

    (一)一个完整的Java.源程序应该包括下列部分:  package语句,该部分至多只有一句,必须放在源程序的第一句.  import语句,该部分可以有若干import语句或者没有,必须放在所有的类定 ...

  8. oracle Data Modeler 使用教程

    由于 powerdesigner 的版权问题.公司要求集体换成 oracle Data Modeler .免费版就够用,哈哈.这有很详细的入门教程,看一看吧: 官方正版教程 ,特详细,只是英文的,也只 ...

  9. 《剑指offer》扑克牌顺子

    本题来自<剑指offer> 反转链表 题目: 思路: C++ Code: Python Code: 总结:

  10. jmeter beanshell遍历接口返回的json数组

    import java.util.LinkedHashMap; import com.jayway.jsonpath.JsonPath; import com.jayway.jsonpath.Pred ...