链表——将两个链表上的数字相加(考虑进位)并将和放入新链表

题目:

给予两个链表,每个节点中有一个0-9的数字,将相应位置上的数字相加并进位,用新的链表存储其和。


例如:

Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8


思路:

可能的情况有:

1.两个链表first和second都没有到表尾;

2.一个到表尾,另一个没有;

3.两个都到表尾;


注意!当一个链表到结尾或者两个链表都到结尾时,但是carry不为0,程序仍不能结束;


代码如下:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode addTwoNumbers(ListNode first, ListNode second) {
        if(first==null)
            return second;
        if(second==null)
            return first;
        
        int sum=0;//first和second对应结点的和,值为(0-9);
        int carry=0;//first和second对应结点求和后对应的进位,值为(0或1);
        
        ListNode head=new ListNode(0);
        
        ListNode cur=head;
        //两个链表都没有到表尾的情况;
        while(first!=null&&second!=null)
            {
            sum=(carry+first.val+second.val)%10;
            ListNode temp=new ListNode(sum);
            cur.next=temp;
            cur=cur.next;
            
            carry=(carry+first.val+second.val)/10;   
            first=first.next;
            second=second.next;
        }
        //至少有一个链表到表尾并且carry为0的情况;
        if(carry==0)
            {
        if(first!=null)
            {
            cur.next=first;
        }else
            {
            cur.next=second;
        }
        }else//至少一个链表到表尾但carry为1的情况,测试用例中有carry为1,链表其余数字全为9的情况;
            {
            //两个链表都到表尾;
            if(first==null&&second==null)
                {
                ListNode temp=new ListNode(carry);
                cur.next=temp;
            }else //只有一个链表到表尾;
                {
                ListNode node=null;
                if(first!=null)
                    {
                    node=first;
                }else
                    {
                   node=second;
                }
                while(node!=null||carry!=0)
                    {
                    if(node!=null)
                        {
                    sum=(carry+node.val)%10;
                    }else
                        {
                        sum=carry;
                        carry=0;
                    }
                    ListNode temp=new ListNode(sum);
                    cur.next=temp;
                    cur=cur.next;
                    
                    if(node!=null)
                        {
                    carry=(carry+node.val)/10;
                    node=node.next;
                    }
                }
            }
        }
        
        return head.next;
    }
}


你可能感兴趣的:(链表——将两个链表上的数字相加(考虑进位)并将和放入新链表)