每日一题(4.8)

本文介绍了LeetCode中关于环形链表(141题)的检测方法及两数相加(2题)的链表相加算法,包括解题思路和代码实现
摘要由CSDN通过智能技术生成

Leecode-141-环形链表

题目

给你一个链表的头节点 head ,判断链表中是否有环。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。

如果链表中存在环 ,则返回 true 。 否则,返回 false 。

示例

示例1
示例1

输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

示例2
示例2

输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。

示例3
示例3

输入:head = [1], pos = -1
输出:false
解释:链表中没有环。

解题思路

  1. 首先对链表进行判空操作
  2. 创建快慢指针
  3. 当快慢指针未相遇时,进入循环,若快指针指向节点或快指针指向节点的下一个节点为空,返回false,否则,慢指针走一步,快指针走两步
  4. 出循环后若未返回false。则快慢指针相遇,返回true

代码实现

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */

 //快慢指针
bool hasCycle(struct ListNode *head) {
    if(head == NULL || head->next == NULL) return false;
    struct ListNode* pos = head;
    struct ListNode* p = head->next;
    while(pos != p){
        if(p==NULL||p->next==NULL){
            return false;
        }
        pos=pos->next;
        p=p->next->next;
    }
    return true;
}

Leecode-2-两数相加

题目

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例

示例1
示例1

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.

示例2

输入:l1 = [0], l2 = [0]
输出:[0]

示例3

输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]

解题思路

  1. 创建一个头结点用来存储传入的数据之和,改头结点为哑节点,不做返回
  2. 使用三目运算符,若l1或l2所指节点为空,则对需要相加的数num1或num2赋值为0
  3. sum存储两数和,并将其对10的取余值赋给节点的数据域,移动指针,对sum做sum/=10的处理,表示进位
  4. 返回头节点的下一个节点

tips:对节点开辟空间后,一定要对其指针域赋值,否则会造成野指针

代码实现

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {
    int sum = 0;   
    struct ListNode* head = (struct ListNode*)malloc(sizeof(struct ListNode));
    head->next = NULL;
    struct ListNode* foot = head;
    while(l1 || l2 || sum){
        int num1 = l1 ? l1->val : 0;
        int num2 = l2 ? l2->val : 0;
        sum += num1 + num2;
    
        foot->next = (struct ListNode*)malloc(sizeof(struct ListNode));
        foot->next->next = NULL;
        foot = foot->next;
        foot->val = sum % 10;
        sum /= 10;
        
        if (l1) {
            l1 = l1->next;
        }
        if (l2) {
            l2 = l2->next;
        }
    }
    return head->next;
}

  • 14
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值