目录
前言
2021-10-16
题目·
1.链表相交
?2.两数相加
3.反转链表2
题解?
1.链表相交
2.两数相加
3. 反转链表:二
代码
1.链表相交
2.两数相加?
3.反转链表二?
总结
前言
接着上一篇文章,我已经坚持刷了八天的题和更新了八天的博客,八天一共刷了25题,有难有易,坚持一周对我来说已经是很大的一个进步了,但是这个活动昨天才开始哦!第一届LeetCode刷题打卡赢现金活动,其他小伙伴快来和我们一起卷起来吧!!!!
肝就完事,不说了我要上号了!!
2021-10-16
题目·
1.链表相交
?2.两数相加
?
3.反转链表2
?
?
题解?
1.链表相交
这个链表相交其实就是相交的地方是相同的地址,所以我们可以遍历,然后在判定两个链表是否相等。
如果两个链表长度相等的话,就直接可以使用循环判断来判断是否四相同的链表,如果链表不是等长的话,先求出两个链表的长度,然后取两者的差值,然后链表较长的那个向前移动差值个单位,然后在开始for循环比较!!
2.两数相加
思路:我们可以先遍历链表,然后把链表里面的值存取到数组中,然后在从数组里面取出相加获得所得值,并转换为字符串的形式,然后创建一个新的指针,指向每一个字符串,并输出这个链表。?
3. 反转链表:二
思路:
先把指定区域的链表给拆出来,定义一个如反转链表第一题一样的函数,然后把指定区域的链表给传参到这个数组,反转后在传出,并给外面的链表链接!!
下面我花了一个简图,大家凑合着看看嘿嘿嘿嘿。
?
代码
1.链表相交
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
struct ListNode *p1 = headA;
struct ListNode *p2 =headB;
int i = 0 , j = 0 ,sum ;
p1 = headA;
p2 = headB;
while (p1 != NULL){
p1 = p1 -> next;
++i;
}
while ( p2 != NULL){
p2 = p2 -> next;
j++;
}
p1 = headA;
p2 = headB;
if ( i > j){
sum = i - j;
while (sum> 0){
p1 = p1->next;
--sum;
}}else{
sum = j - i;
while (sum ){
p2 = p2 -> next;
--sum;
}
}
while (p1 && p2 ){
if (p1 == p2 ){
return p1;
}
p1 = p1 -> next ;
p2 = p2 -> next ;}
return NULL;
}
2.两数相加?
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
def ltn(listnode):
# 将ListNode转换为list,并储存到listTemp里
listTemp=[]
temp=0
while temp<100:
try:
listTemp.append(listnode.val)
listnode=listnode.next
except:
break
temp+=1
# 将list翻转并转换成数字(string形式)
listTemp.reverse()
string=""
for item in listTemp:
string+=str(item)
return string
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
temp=0
num1=ltn(l1)
num2=ltn(l2)
# 利用上述函数将l1和l2转换为数字
sum=str(int(num1)+int(num2))
# 转为数字,相加
sumlist=ListNode(int(sum[0]))
try:
for order in range(1,len(sum)):
sumlist=ListNode(int(sum[order]),sumlist)
except:
pass
return(sumlist)
3.反转链表二?
?
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
void reverse( struct ListNode *head){
struct ListNode *pre = NULL;
struct ListNode *cur = head;
while (cur != NULL) {
struct ListNode *next = cur->next;
cur->next = pre;
pre = cur;
cur = next;
}
}
struct ListNode* reverseBetween(struct ListNode* head, int left, int right){
struct ListNode * dump = malloc(sizeof(struct ListNode));
dump -> val = -1;
dump -> next = head;
struct ListNode * res = dump;
for ( int i = 0; i < left -1; i++){
res = res -> next ;}
struct ListNode * right1 = res;
for ( int j = 0 ; j < right - left + 1; j++ ){right1 = right1 -> next ;}
struct ListNode *leftNode = res->next;
struct ListNode *curr = right1->next;
res->next = NULL;
right1->next = NULL;
reverse(leftNode);
res->next = right1;
leftNode->next = curr;
return dump->next;
}
总结
又到了每天的总结时刻嘿嘿嘿嘿!!!
今天是第九天写算法题,我今天看了我总共刷的力扣有50道题嘿嘿。
?虽然mid和hard还是很少,但是我还在进步,我相信慢慢的我掌握的算法知识储备会越来越多,对一些算法题也会越来越熟练的,十分期待那个时候的我会变成什么样子,就先从小目标慢慢的开始吧,相信自己,坚持住!!!!
看一下今天的手稿嘿嘿嘿嘿嘿!!!
?
|