LeetCode中等题

题目一:

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

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

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

示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807

分析:这道题目是一个链表题,对链表元素相加得出一个新的链表,那么怎么能实现链表元素的相加呢?其实这和我们实现两个数相加很类似,首先应该从个位数开始,如果之和大于10则将向前进一位。

1、创建一个新的链表,用于返回最后相加和的结果,ListNode DummyNode=new ListNode(0);

2、设置一些指向链表的节点,分别指向l1,l2,DummyNode, p1=l1,p2=l2,curr=DummyNode;

3、开始遍历列表,进行求和,首先获取了l1,l2头节点的值,在进行相加  int x=(p1!=null)? p1.val:0;    int y=(p2!=null)? p2.val:0;   int sum=x+y+count;

4、这里的难点在于求和后的结果超过10应该怎么办?我们应该将其记录下来,然后添加到下一次求和中,如上式的sum,记录的方式为:sum=sum/10,结果是0或者1;

5、curr节点应该添加一个新的节点,并且存放所求得的和值,方式为curr.next=new ListCode(sum%10);

6、将curr,p1,p2分别向后移动指针, curr=curr.next;    if(p1!=null) p1=p1.next;    if(p2!=null) p2=p2.next;

7、如果在最后一轮循环中count大于1,这需要新创建一个节点  curr.next=new ListNode(count);

8、返回链表DummyNode.next,因为第一个节点为0,无意义。

具体实现过程:

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        
        ListNode DummyNode=new ListNode(0);
        ListNode p1=l1,p2=l2,curr=DummyNode;
        
        int count=0;    
        while(p1!=null||p2!=null)
        {
            int x=(p1!=null)? p1.val:0;
            int y=(p2!=null)? p2.val:0;
            int sum=x+y+count;
            count=sum/10;
            
            curr.next=new ListNode(sum%10);
            curr=curr.next;
            if(p1!=null) p1=p1.next;
            if(p2!=null) p2=p2.next;
        }
        
        if(count>0)
            curr.next=new ListNode(count);
        
        return DummyNode.next;
    }
}

 

 

猜你喜欢

转载自www.cnblogs.com/Optimism/p/11272814.html