題目要求:node
public class ListNode { ListNode next = null; int value; // 節點數據 public ListNode(int value) { this.value = value; } }
主要方法代碼以下:數據結構
public ListNode addTwoNumbers(ListNode listNode1, ListNode listNode2){ // 若是有空鏈表,直接返回 if(listNode1 == null) { return listNode2; }else if(listNode2 == null) { return listNode1; } // 判斷兩個鏈表是否等長,不等長則左補0使之相等 if(size(listNode1) > size(listNode2)) { listNode2 = complete(listNode2, size(listNode1) - size(listNode2)); }else if(size(listNode1) < size(listNode2)) { listNode1 = complete(listNode1, size(listNode2) - size(listNode1)); } // 反轉鏈表 listNode1 = reserveLink(listNode1); listNode2 = reserveLink(listNode2); ListNode resultListNode = new ListNode(0); ListNode listNode = resultListNode; int sum = 0; // 相加總和 int prog = 0; // 進位值 while(listNode1 != null && listNode2 != null) { sum = listNode1.value + listNode2.value + prog; prog = sum / 10; sum = sum % 10; listNode.next = new ListNode(sum); // 尾插法 listNode = listNode.next; // 後移 listNode1 = listNode1.next; listNode2 = listNode2.next; } // 最高位還有進位 if(prog != 0){ listNode.next = new ListNode(prog); }else { // 去掉最前面的0,防止反轉後數值不對 resultListNode = resultListNode.next; } return reserveLink(resultListNode); }
獲取鏈表長度:ui
public int size(ListNode node) { if(node == null) { return 0; } int size = 0; while(node != null) { node = node.next; size++; } return size; }
左補N個0:this
public ListNode complete(ListNode node, int num) { if(node == null) { return node; } if(num <= 0) { return node; } for (int i = 0; i < num; i++) { ListNode n0 = new ListNode(0); n0.next = node; node = n0; } return node; }
反轉鏈表:spa
private ListNode reserveLink(ListNode head) { ListNode preNode = null; while(head != null) { ListNode nextNode = head.next; // 保留下一個結點 head.next = preNode; //指針反轉 preNode = head; //前結點後移 head = nextNode; //當前結點後移 } return preNode; }