【LeetCode】1171. 从链表中删去总和值为零的连续节点、面试题 02.05. 链表求和

简介: 目录 1171. 从链表中删去总和值为零的连续节点 面试题 02.05. 链表求和

作者:小卢

专栏:《Leetcode》

喜欢的话:世间因为少年的挺身而出,而更加瑰丽。                                  ——《人民日报》


目录

1171. 从链表中删去总和值为零的连续节点

面试题 02.05. 链表求和


1171. 从链表中删去总和值为零的连续节点

1171. 从链表中删去总和值为零的连续节点

题目描述:

给你一个链表的头节点 head,请你编写代码,反复删去链表中由 总和 值为 0 的连续节点组成的序列,直到不存在这样的序列为止。

删除完毕后,请你返回最终结果链表的头节点。

你可以返回任何满足题目要求的答案。

(注意,下面示例中的所有序列,都是对 ListNode 对象序列化的表示。)

示例:

代码:

struct ListNode* removeZeroSumSublists(struct ListNode* head){
    struct ListNode*newhead=(struct ListNode*)malloc(sizeof(struct ListNode));
    newhead->next=head;
    struct ListNode*cur1=newhead;
    struct ListNode*cur2=head;
    while(cur1)
    {
        int num=0;
        cur2=cur1->next;
        while(cur2)
        {
            num-=cur2->val;
            if(num==0)
            {
                cur1->next=cur2->next;
            }
            cur2=cur2->next;
        }
        cur1=cur1->next;
    }
    return newhead->next;
}

面试题 02.05. 链表求和

面试题 02.05. 链表求和

题目描述:

给定两个用链表表示的整数,每个节点包含一个数位。

这些数位是反向存放的,也就是个位排在链表首部。

编写函数对这两个整数求和,并用链表形式返回结果。

示例:

思路:

暴力解法是不可以的,两个链表相加的值会大于10的18次方,大于longlong的数据范围

我们可以每位相加,然后计入它的进位值,放到一个新的链表中。

代码:

struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
    struct ListNode*cur1=l1;
    struct ListNode*cur2=l2;
    struct ListNode*newhead=NULL;
    struct ListNode*tail=NULL;
    int carry=0;//进位值
    while(cur1||cur2)
    {
        int num1=0;
        int num2=0;
        if(cur1)
        num1=cur1->val;
        if(cur2)
        num2=cur2->val;
        int sum=num1+num2+carry;
        //创建一个新的链表
        if(newhead)
        {
            tail->next=(struct ListNode*)malloc(sizeof(struct ListNode));
            tail=tail->next;
            tail->val=sum%10;
            tail->next=NULL;
        }
        else
        {
            newhead=tail=(struct ListNode*)malloc(sizeof(struct ListNode));
            tail->val=sum%10;
            tail->next=NULL;
        }
        carry=sum/10;
        if(cur1)
        cur1=cur1->next;
        if(cur2)
        cur2=cur2->next;
    }
    if(carry>0)//最高位可能大于0,比如:10000000
    {
         tail->next=(struct ListNode*)malloc(sizeof(struct ListNode));
         tail=tail->next;
         tail->val=carry;
         tail->next=NULL;
    }
    return newhead;
}
相关文章
|
9月前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
97 1
|
9月前
Leetcode第21题(合并两个有序链表)
这篇文章介绍了如何使用非递归和递归方法解决LeetCode第21题,即合并两个有序链表的问题。
118 0
Leetcode第21题(合并两个有序链表)
|
1月前
|
机器学习/深度学习 算法
24. 两两交换链表中的节点, 19.删除链表的倒数第N个节点 ,面试题 02.07. 链表相交
1. **两两交换链表中的节点**:通过引入虚拟头结点,使所有节点都能采用统一的交换逻辑,避免对头结点单独处理。 2. **删除链表的倒数第N个节点**:利用双指针技巧,让快慢指针保持N个节点的距离,当快指针到达末尾时,慢指针正好指向待删除节点的前一个节点。 3. **链表相交**:先计算两链表长度并调整起点,确保从相同距离末尾的位置开始遍历,从而高效找到相交节点或确定无交点。 以上方法均在时间复杂度和空间复杂度上进行了优化,适合用于理解和掌握链表的基本操作及常见算法设计思路。
|
3月前
|
算法 Go
【LeetCode 热题100】23:合并 K 个升序链表(详细解析)(Go语言版)
本文详细解析了 LeetCode 热题 23——合并 K 个升序链表的两种解法:优先队列(最小堆)和分治合并。题目要求将多个已排序链表合并为一个升序链表。最小堆方法通过维护节点优先级快速选择最小值,;分治合并则采用归并思想两两合并链表。文章提供了 Go 语言实现代码,并对比分析两种方法的适用场景,帮助读者深入理解链表操作与算法设计。
115 10
|
9月前
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
93 0
LeetCode第二十四题(两两交换链表中的节点)
|
9月前
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第19题要求删除链表的倒数第N个节点,可以通过快慢指针法在一次遍历中实现。
94 0
Leetcode第十九题(删除链表的倒数第N个节点)
|
9月前
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
106 0
|
9月前
【LeetCode 46】450.删除二叉搜索树的节点
【LeetCode 46】450.删除二叉搜索树的节点
67 0
|
9月前
|
索引
力扣(LeetCode)数据结构练习题(3)------链表
力扣(LeetCode)数据结构练习题(3)------链表
197 0
|
10月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
141 6
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行

热门文章

最新文章