import java.util.*; /* * public class ListNode { * int val; * ListNode next = null; * public ListNode(int val) { * this.val = val; * } * } */ public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param head1 ListNode类 * @param head2 ListNode类 * @return ListNode类 */ public ListNode addInList (ListNode head1, ListNode head2) { // write code here ListNode reverseHead1 = reverseList(head1); ListNode reverseHead2 = reverseList(head2); //System.out.println(reverseHead2.val); ListNode sumList = new ListNode(0); ListNode sumListHead = sumList; while (reverseHead1 != null || reverseHead2 != null) { if (reverseHead1 != null && reverseHead2 != null) { int sum = reverseHead1.val + reverseHead2.val; sumList.val += sum; if (sumList.val >= 10) { //进一 ListNode newNode = new ListNode(1); sumList.next = newNode; sumList.val -= 10; sumList = newNode; } else { //不需要进一,也需要创建一个新的节点 ListNode newNode = new ListNode(0); sumList.next = newNode; sumList = newNode; } reverseHead1 = reverseHead1.next; reverseHead2 = reverseHead2.next; } else if (reverseHead2 == null) { int sum = reverseHead1.val; sumList.val += sum; //进一 if (sumList.val >= 10) { //进一 ListNode newNode = new ListNode(1); sumList.next = newNode; sumList.val -= 10; sumList = newNode; } else { //不需要进一,也需要创建一个新的节点 ListNode newNode = new ListNode(0); sumList.next = newNode; sumList = newNode; } reverseHead1 = reverseHead1.next; } else if (reverseHead1 == null) { int sum = reverseHead2.val; sumList.val += sum; //进一 if (sumList.val >=10) { //进一 ListNode newNode = new ListNode(1); sumList.next = newNode; sumList.val -= 10; sumList = newNode; } else { //不需要进一,也需要创建一个新的节点 ListNode newNode = new ListNode(0); sumList.next = newNode; sumList = newNode; } reverseHead2 = reverseHead2.next; } } /*while(sumListHead!=null){ System.out.println(sumListHead.val); sumListHead = sumListHead.next; }*/ //反转,再去除结果链表里开头的0 sumListHead = reverseList(sumListHead); while (sumListHead.val == 0) { if(sumListHead == null ) break; sumListHead = sumListHead.next; } return sumListHead; } ListNode reverseList (ListNode head) { if (head == null) return head; if (head.next == null) return head; ListNode last, current, next; last = head; current = head.next; next = current.next; //将反转以后的尾节点指向null last.next = null; while (current != null) { current.next = last; last = current; current = next; if (next != null) next = next.next; } return last; } }
感觉解法有些繁琐。
思路是将两个链表一起反转,然后按位想加,用一个新的链表存储和,相加之和大于等于10的位需要进一。
反转的时候,注意需要将原头节点的next设置为null。
在处理进一操作时,可以用以下代码简化if判断
ListNode newNode = new ListNode(0); newNode.val = sumList.val/10; sumList.val = sumList.val%10; sumList.next = newNode; sumList = newNode;