leetcode

1.两数相加

给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 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;

  }

}

 

2. 无重复字符的最长子串

难度中等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)) )

      {

        occ.add(s.charAt(rk+1));

        rk++;

      }

      ans=Math.max(ans,rk-i+1);

    }

    return ans;

  }

}

posted @ 2020-08-17 21:42  幻影如梦  阅读(67)  评论(0)    收藏  举报