Leecode-141-环形链表
题目
给你一个链表的头节点 head ,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。
如果链表中存在环 ,则返回 true 。 否则,返回 false 。
示例
示例1
输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。
示例2
输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。
示例3
输入:head = [1], pos = -1
输出:false
解释:链表中没有环。
解题思路
- 首先对链表进行判空操作
- 创建快慢指针
- 当快慢指针未相遇时,进入循环,若快指针指向节点或快指针指向节点的下一个节点为空,返回false,否则,慢指针走一步,快指针走两步
- 出循环后若未返回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
输入: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]
解题思路
- 创建一个头结点用来存储传入的数据之和,改头结点为哑节点,不做返回
- 使用三目运算符,若l1或l2所指节点为空,则对需要相加的数num1或num2赋值为0
- sum存储两数和,并将其对10的取余值赋给节点的数据域,移动指针,对sum做
sum/=10
的处理,表示进位 - 返回头节点的下一个节点
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;
}