小争哥的算法打卡
1.单链表翻转
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head){
/*方法一
struct ListNode* cur = head;
struct LisrNode* newhead = NULL;
while(cur)
{
struct ListNode* next = cur->next;
cur->next = newhead;
newhead = cur;
cur = next;
}
return newhead;*/
//方法二
if(head == NULL||head->next == NULL)
return head;
struct ListNode *n1 = NULL;
struct ListNode *n2 = head;
struct ListNode *n3 = head->next;
while(n2)
{
n2->next = n1;
n1 = n2;
n2 = n3;
if(n3)
n3 = n3->next;
}
return n1;
}
2.两数相加
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
int sum;
int flag = 0;
struct ListNode* head = (struct ListNode*)malloc(sizeof(struct ListNode));
head->next = NULL;
struct ListNode* pend = head;
while(flag || l1 != NULL || l2 != NULL)
{
struct ListNode* pnew = (struct ListNode*)malloc(sizeof(struct ListNode));
pnew->next = NULL;
sum = 0;
if(l1 != NULL)
{
sum += l1->val;
l1 = l1->next;
}
if(l2 != NULL)
{
sum += l2->val;
l2 = l2->next;
}
sum += flag;
flag = 0;
if(sum >= 10)
{
sum -= 10;
flag = 1;
}
pnew->val = sum;
pend->next = pnew;
pend = pnew;
}
return head->next;
}