leetcode
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
我的解法:
C语言
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
struct ListNode* p1=l1, p2=l2,s;
struct ListNode* l3=(struct ListNode*)malloc(sizeof(struct ListNode));
s=l3;//初始时尾节点指向头节点
int tens=0;//进位
while(p1!=NULL&&p2!=NULL)
{
//尾插法
struct ListNode* q=(struct ListNode*)malloc(sizeof(struct ListNode));
q->next=NULL;
if(p1->val+p2->val+tens>9)
{
q->val=p1->val+p2->val+tens-10;
tens=1;
s->next=q;
s=q;
}
else
{
q->val=p1->val+p2->val+tens;
tens=0;
s->next=q;
s=q;
}
p1=p1->next,p2=p2->next;
}
if(p1!=NULL)
{
s->next=p1;
}
else
{
s->next=p2;
}
return l3->next;
}
错误:忽略了最后一位相加大于10的情况
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
struct ListNode* p1=l1, p2=l2,s;
struct ListNode* l3=(struct ListNode*)malloc(sizeof(struct ListNode));
s=l3;//初始时尾节点指向头节点
int tens=0;//进位
int x,y,sum;
while(p1!=NULL||p2!=NULL)
{
//尾插法
struct ListNode* q=(struct ListNode*)malloc(sizeof(struct ListNode));
q->next=NULL;
if(p1==NULL){x=0;}
else{x=p1->val;p1=p1->next;}
if(p2==NULL){y=0;}
else{y=p2->val;p2=p2->next;}
sum=x+y+tens;
if(sum>9) {q->val=sum-10;tens=1;s->next=q;s=q; }
else{ q->val=sum; tens=0;s->next=q;s=q; }
}
if(tens==1)//最后相加多出一位
{
struct ListNode* q=(struct ListNode*)malloc(sizeof(struct ListNode));
q->next=NULL;
q->val=1;
s->next=q;
s=q;
}
return l3->next;
}
java
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode dummyHead=new ListNode(0);//头节点不存数据
ListNode RearNode=dummyHead;//初始化尾节点指向头节点
ListNode p1=l1,p2=l2;
int carry=0;//进位
while(p1!=null || p2!=null)
{
int x=(p1!=null)?p1.val:0;
int y=(p2!=null)?p2.val:0;
int sum =x+y+carry;
//插入节点
if(sum>9){RearNode.next=new ListNode(sum-10);carry=1;}
else{RearNode.next=new ListNode(sum);carry=0;}
RearNode=RearNode.next;
if(p1!=null){p1=p1.next;}
if(p2!=null){p2=p2.next;}
}
if(carry==1){RearNode.next=new ListNode(1);}
return dummyHead.next;
}
}
难度中等4174
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
class Solution {
public int lengthOfLongestSubstring(String s) {
//采用滑动窗口
Set<Character> occ=new HashSet<Character>();
int ans=0,len=s.length();
int rk=-1;
for(int i=0;i<len;i++)
{
if(i!=0)//左指针向左移动一位,删除集合中此元素
{
occ.remove(s.charAt(i-1));
}
//右指针一直往右移并将元素加入到集合中,直到出现与集合重复元素
while(rk+1<len && !occ.contains(s.charAt(rk+1)) )
{
rk++;
}
ans=Math.max(ans,rk-i+1);
}
return ans;
}
}

浙公网安备 33010602011771号