力扣2 两数相加

力扣2 两数相加:

提示:使用合并有序链表思想


问题描述

给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

力扣2 两数相加_第1张图片


题解分析:

提示:使用合并排序链表的思想

  • 使用双指针遍历两个链表
  • 两个链表长度可能会不一致,因此遍历为空时当前值为0,将两个指针指向的节点值相加,记录当前值的进位数carry和留下来的个位数remain
  • 遍历到下一个节点是需要加上进位数carry

解决方案:

提示:具体代码如下

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode dummyHead=new ListNode(-1);
        ListNode r=dummyHead;
        // remain是留下来的个位数,carry是进位
        int carry=0,remain=0;
        while(l1!=null||l2!=null){
            int x=l1==null?0:l1.val;
            int y=l2==null?0:l2.val;
            int curSum=x+y+carry;
            remain=curSum%10;
            carry=curSum/10;
            r.next=new ListNode(remain);
            r=r.next;
            if(l1!=null) l1=l1.next;
            if(l2!=null) l2=l2.next;
        }
        if(carry!=0){
            r.next=new ListNode(carry);
        }
        return dummyHead.next;
    }
}

你可能感兴趣的:(leetcode刷题日记,leetcode,算法,java)