1、两数相加
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
// 思路:获取长度,长度较短的补0.依次相加然后进位
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode *head = new ListNode(0);
ListNode *newList = head;
long i = 0;
while(l1 != NULL|| l2 != NULL || i != 0){
if(l1 != NULL) {
i += l1->val;
l1 = l1 -> next;
}
if(l2 != NULL) {
i += l2->val;
l2 = l2 -> next;
}
ListNode* node = new ListNode();
node -> val = i % 10;
head->next = node;
head = head->next;
i /= 10;
}
return newList->next;
}
};
2、环形链表
给定一个链表,判断链表中是否有环。
思路:快慢指针
class Solution {
public:
bool hasCycle(ListNode *head) {
ListNode *p = head;
ListNode *L1 = head;
ListNode *L2 = head;
if(p == nullptr || p->next == nullptr)
return false;
while(L1 && L2 && L2 -> next) {
L1 = L1 -> next;
L2 = L2 -> next -> next;
if(L1 == L2) {
return true;
}
}
return false;
}
};