单链表按位求和的多种实现方式

单链表求和

问题描述:

  • 给定两个链表,分别表示两个非负整数。它们的数字逆序存储在链表中,且每个结点只存储一个数字,计算两个数的和,并且返回
  • 和的链表头指针。
  • 例如输入:2->4->3、5->6->4,输出:7->0->8
    解题思路:
  • 首先定义两个指针分别指向两条链表的头结点同时定义一个进位标注符初始值为0,然后判断两个指针指向的节点都不为空时,定义一个新的节点节点的值为两个指针指向节点value
  • 值的和再加上进位标志符的值然后对10求余;同时更新进位标志符为当前和对10相除取整(向下取整)。依次同时向后移动两个指针,直到有一个指针指向链表尾。
  • if判断,如果指针1已经指向链表1的尾,那么此时新的节点值为指针2指向的节点值+进位标志值再对10取余。同时更新进位标志符的值为当前和对10取整。
  • 依次向后移动指针2,直到遍历结束。同理如果指针2已经指向链表2的尾,而1还没有,那么新的节点值为指针1指向节点值+进位标志值再对10取余…
public class AddofList {
    public static void main(String[] args) {
        int[] arr1 = {4, 9, 0, 4, 7, 1};
        int[] arr2 = {1, 7, 1, 5, 5, 4, 2, 8};
//        SNode head1 = new SNode(arr1[0]);
//        SNode curNode = new SNode();
//        head1.next = curNode;
//        for (int i = 1; i < arr1.length; i++) {
//            curNode.value = arr1[i];
//            curNode.next = new SNode();
//            curNode = curNode.next;
//        }
//        SNode head2 = new SNode(arr2[0]);
//        SNode curNode2 = new SNode();
//        head2.next = curNode2;
//        for (int i = 1; i < arr2.length; i++) {
//            curNode2.value = arr2[i];
//            curNode2.next = new SNode();
//            curNode2 = curNode2.next;
//        }
        SNode head1=new SNode();
        for(int i=arr1.length-1;i>=0;i--){
            SNode p=new SNode(arr1[i]);
            p.next=head1.next;
            head1.next=p;
        }
        SNode head2=new SNode();
        for(int i=arr2.length-1;i>=0;i--){
            SNode p=new SNode(arr2[i]);
            p.next=head2.next;
            head2.next=p;
        }
//        System.out.println("链表1的头:" + head1.value);
//        while (head1!=null){
//            System.out.print(head1.value+"->");
//            head1=head1.next;
//        }
//        System.out.println("链表2的头:" + head2.value);
//        while (head2!=null){
//            System.out.print(head2.value+"->");
//            head2=head2.next;
//        }
        System.out.println(head1.next.value);
        System.out.println(head2.next.value);
//        SNode resultNode=addList(head1,head2);
        SNode resultNode=addLists02(head1.next,head2.next);
        while (resultNode!=null){
            System.out.print(resultNode.value+"->");
            resultNode=resultNode.next;
        }
    }

    public static SNode addList(SNode head1, SNode head2) {
        SNode pSum = new SNode();
        SNode pTail = pSum;
        SNode p1 = head1.next;
        SNode p2 = head2.next;
        SNode pCur = null;
        int carry = 0;
        int value = 0;
        while (p1 != null && p2 != null) {
            value = p1.value + p2.value + carry;
            carry = value / 10;
            value = value % 10;
            pCur = new SNode(value);
            pTail.next = pCur;
            pTail = pCur;
            p1 = p1.next;
            p2 = p2.next;
        }
        if (p1 == null) {
            SNode p = p2;
            while (p != null) {
                value = p.value + carry;
                carry = value / 10;
                value = value % 10;
                pCur= new SNode(value);
                pTail.next = pCur;
                pTail = pCur;
                p = p.next;
            }
        }
        if (p2 == null) {
            SNode p = p1;
            while (p != null) {
                value = p.value + carry;
                carry = value / 10;
                value = value % 10;
                pCur= new SNode(value);
                pTail.next = pCur;
                pTail = pCur;
                p = p.next;
            }
        }
        if(carry!=0){
            pTail.next=new SNode(carry);
        }
        return pSum;
    }
    /**
     * 其他解决方案02
     */
    public static SNode addLists(SNode l1,SNode l2){
        SNode result=l1;
        SNode temp=l1;
        SNode lastNode=null;
        int sum=0;
        while (l1!=null || l2!=null){
            if(l1!=null){
                sum+=l1.value;
                l1=l1.next;
            }
            if(l2!=null){
                sum+=l2.value;
                l2=l2.next;
            }
            if(l2!=null && l1==null){
                temp.next=new SNode(0);
            }
            if(sum>=10){
                temp.value=sum%10;
                if(temp.next==null){
                    lastNode=temp;
                }
                temp=temp.next;
                sum=1;
            }else {
                temp.value=sum;
                temp=temp.next;
                sum=0;
            }
        }
        if(sum==1){
            lastNode.next=new SNode(1);
        }
        return result;
    }
    /**
     * 其他解决方案3
     */
    public static SNode addLists02(SNode l1,SNode l2){
        int sum=0;
        SNode tempNodeList=new SNode(0);
        SNode resultNodeList=tempNodeList;
        while (l1!=null || l2!=null){
            if(l1!=null){
                sum+=l1.value;
                l1=l1.next;
            }
            if(l2!=null){
                sum+=l2.value;
                l2=l2.next;
            }
            if(sum>=10){
                tempNodeList.value=sum%10;
                sum=1;
            }else {
                tempNodeList.value=sum;
                sum=0;
            }
            if(l1!=null || l2!=null){
                tempNodeList.next=new SNode(0);
                tempNodeList=tempNodeList.next;
            }
        }
        if(sum==1){
            tempNodeList.next=new SNode(1);
        }
        return resultNodeList;
    }
}

class SNode {
    SNode next;
    int value;

    public SNode() {
    }

    public SNode(int value) {
        this.value = value;
    }
}

你可能感兴趣的:(算法与数据结构,Java开发)