Leetcode口试经典150题-2.两数相加

打印 上一主题 下一主题

主题 1038|帖子 1038|积分 3114

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
解法都在代码里,不懂就留言或者私信
理论上提交这个就是最优解
字节考过不下20次,这个高居字节口试榜第9名
  1. /**
  2. * Definition for singly-linked list.
  3. * public class ListNode {
  4. *     int val;
  5. *     ListNode next;
  6. *     ListNode() {}
  7. *     ListNode(int val) { this.val = val; }
  8. *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
  9. * }
  10. */
  11. class Solution {
  12.     /**本题从头到尾相加,还算比较简单,就每一位相加,算出进位值然后给下一位
  13.     每一位都这么加,直到某个位不再有数停止遍历,如果有某个还不为空,就继续遍历这一个链表
  14.     最后如果有进位,单独出一位(如果有就是1,这是常识) */
  15.     public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
  16.         /**和一个空的数相加相当于加了0,返回自己即可 */
  17.         if(l1 == null || l2 == null) {
  18.             return l1 == null? l2 : l1;
  19.         }
  20.         /**carry表示进位,整个计算过程中我们就用这一个进位变量*/
  21.         int carry = 0;
  22.         /**head是整个结果链表的头节点 */
  23.         ListNode head = null;
  24.         ListNode lastConnect = null;
  25.         while(l1 != null && l2 != null) {
  26.             /**毛和(进位之前的) */
  27.             int grossSum = l1.val + l2.val + carry;
  28.             /**当前位进位之后的值*/
  29.             int curNum = grossSum % 10;
  30.             /**进位 */
  31.             carry = grossSum / 10;
  32.             ListNode cur = new ListNode(curNum);
  33.             /**如果这是结果的第一个节点,把它设置为头和最后一个被连上的节点 */
  34.             if(head == null) {
  35.                 head = cur;
  36.                 lastConnect = cur;
  37.             } else {
  38.                 lastConnect.next = cur;
  39.                 lastConnect = cur;
  40.             }
  41.             /**当前处理完毕,都跳下一个 */
  42.             l1 = l1.next;
  43.             l2 = l2.next;
  44.         }
  45.         while(l1 != null) {
  46.             /**如果链表1还没有用完,那就继续计算它和进位 */
  47.             int grossSum = l1.val + carry;
  48.             int curNum = grossSum % 10;
  49.             carry = grossSum / 10;
  50.             ListNode cur = new ListNode(curNum);
  51.             /**这个时候不会出现结果链表还没初始化的情况,不用判断head是不是为null*/
  52.             lastConnect.next = cur;
  53.             lastConnect = cur;
  54.             l1 = l1.next;
  55.         }
  56.         while(l2 != null) {
  57.             /**如果链表1还没有用完,那就继续计算它和进位 */
  58.             int grossSum = l2.val + carry;
  59.             int curNum = grossSum % 10;
  60.             carry = grossSum / 10;
  61.             ListNode cur = new ListNode(curNum);
  62.             /**这个时候不会出现结果链表还没初始化的情况,不用判断head是不是为null*/
  63.             lastConnect.next = cur;
  64.             lastConnect = cur;
  65.             l2 = l2.next;
  66.         }
  67.         /**如果最后还有进位,那就进位作为最后一个节点 */
  68.         if(carry != 0) {
  69.             ListNode carryNode = new ListNode(carry);
  70.             lastConnect.next = carryNode;
  71.         }
  72.         return head;
  73.     }
  74. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

卖不甜枣

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表