两数之和

两数之和

前言

用两个链表分别表示两个非负整数,一个节点就是一个数字,用逆序存储数字,并且每个节点只能存储一位数字

/**
 * 默认已有的链表节点类
 * 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; }
 * }
 */

思路

由于输入的两个链表都是逆序存储数字的位数的,因此两个链表中同一位置的数字可以直接相加。

我们同时遍历两个链表,逐位计算它们的和,并与当前位置的进位值相加。

如果两个链表的长度不同,则可以认为长度短的链表的后面有若干个零。

此外,如果链表遍历结束后有 carry>0,还需要在以head为头节点的链表的后面新添一个节点,节点的值为 carry。

代码

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
       //同时遍历链表,逐步计算他们的和
       //1.变量:n1为链表1的位数的数字,同理n2,carry为进位数
       //2.流程:
      //1)一开始链表头为null,创建第一个节点,并赋值为两数和
      //2)创建一个新节点,并挂上,让指针后移
      //3)循环上2)
      //4)长链表两数和后,如果最后还有carry,则还需要一个新节点,值为carry

      int carry =0;   //一开始为0
      ListNode head = null;
      ListNode end = null;
      while(l1!=null||l2!=null){
        int n1 =  l1!=null?l1.val:0;
        int n2 =  l2!=null?l2.val:0;
        int sum = n1 + n2 +carry;
        
        if(head == null){
          //首部,直接赋值
          head =end = new ListNode(sum%10);
        }else{
          //中间,赋值+新节点
          end.next = new ListNode(sum%10);//创建新节点并挂上
          end = end.next;//end 后移
        }
        //短链表遍历完后,还需要继续往后遍历长链表的节点
        if(l1!=null){
          l1 = l1.next;
        }
        if(l2!=null){
          l2 =l2.next;
        }
        //刷新carry值
        carry = sum/10;
        //尾部,新节点并赋值,值为carry
        if(carry>0){
          end.next = new ListNode(carry);//创建新节点并挂上
        }
        
      }
        return head;//返回以head为头节点的链表
    }
}
posted @ 2023-04-25 00:37  郭培鑫同学  阅读(85)  评论(0编辑  收藏  举报