两链表相加
1:题目描述
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
2:题目分析与答题思路
- 分析:题目是意思是让我们对两个链表进行十进制加法操作,我们可以仿照整数的方式进行处理,从低到高进行相加,然后再调整进位的处理即可。注意由于链表长度没有限制,所以不能通过转化成整型数直接相加,然后再整理成链表的方式,因为最长的long的长度也是有限的!
- 思路:首先将两个链表从低到高相加,不管进位,一直加到其中有一个链表为null,然后在长的链表里进行进位的调整。
3:代码实现
//直接再链表上操作 class planB{ public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode n1 = l1; ListNode n2 = l2; int l1Lenth = 0; int l2Lenth = 0; ListNode temp1 = l1; ListNode temp2 = l2; ListNode end1 = null; ListNode end2 = null; while(true){ if(temp1 == null&&temp2!=null){ l1Lenth = 0; l2Lenth = 1; break; } if(temp1 != null&&temp2==null){ l1Lenth = 1; l2Lenth = 0; break; } if(temp1 == null&&temp2==null){ l1Lenth = l1Lenth; break; } if(temp1 == null&&temp2==null){ l1Lenth = l1Lenth; break; } temp1 = temp1.next; temp2 = temp2.next; } //按节点相加,不管进位 while(true){ if(n1==null||n2==null){ break; } addTwoNodes(n1,n2); n1 = n1.next; n2 = n2.next; } n1 = l1; n2 = l2; //调整长度较长的链表的进位, if(l1Lenth>=l2Lenth){//调整长度较长的链表l1的进位, while(true){ if(n1 == null){ break; } else { if(n1.val>=10){ if(n1.next !=null) { n1.next.val++; } else{ n1.next = new ListNode(1); } n1.val = n1.val-10; } } n1 = n1.next; } } else{//或者调整长度较长的链表l2的进位, while(true){ if(n2 == null){ break; } else { if(n2.val>=10){ if(n2.next !=null) { n2.next.val++; } else{ n2.next = new ListNode(1); } n2.val = n2.val-10; } } n2 = n2.next; } } return l1Lenth>=l2Lenth?l1:l2; } //遍历较长的链表,在长链表上进行操作,假设n1是较长链表的节点 public void addTwoNodes(ListNode n1,ListNode n2){ int sum = n1.val+n2.val; n1.val = sum; n2.val = sum; } }