package suanfa.lintcode;
import java.util.Stack;
//鏈表
class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
next = null;
}
}
public class SumListNode {
/**
* 鏈表求和1:你有兩個(gè)用鏈表代表的整數(shù),其中每個(gè)節(jié)點(diǎn)包含一個(gè)數(shù)字。數(shù)字存儲按照在原來整數(shù)中相反的順序,
* 使得第一個(gè)數(shù)字位于鏈表的開頭。寫出一個(gè)函數(shù)將兩個(gè)整數(shù)相加,用鏈表形式返回和。
*
* @param l1
* example:3->1->5->null
* @param l2
* example:5->9->2->null
* @return
* example:8->0->8->null
*/
public ListNode addListNode1(ListNode l1, ListNode l2) {
ListNode result = new ListNode(0);
ListNode node = result;
// 進(jìn)位標(biāo)志
int flag = 0;
while (l1 != null && l2 != null) {
int value = l1.val + l2.val + flag;
flag = value / 10;
value = value % 10;
node.next = new ListNode(value);
node = node.next;
l1 = l1.next;
l2 = l2.next;
}
while (l1 != null) {
int value = l1.val + flag;
flag = value / 10;
value = value % 10;
node.next = new ListNode(value);
node = node.next;
l1 = l1.next;
}
while (l2 != null) {
int value = l2.val + flag;
flag = value / 10;
value = value % 10;
node.next = new ListNode(value);
node = node.next;
l2 = l2.next;
}
if (flag == 1) {
node.next = new ListNode(1);
node = node.next;
}
return result.next;
}
/**
* 鏈表求和2: 假定用一個(gè)鏈表表示兩個(gè)數(shù),其中每個(gè)節(jié)點(diǎn)僅包含一個(gè)數(shù)字。
* 假設(shè)這兩個(gè)數(shù)的數(shù)字順序排列,請?jiān)O(shè)計(jì)一種方法將兩個(gè)數(shù)相加,并將其結(jié)果表現(xiàn)為鏈表的形式
*
* @param l1
* example:6->1->7
* @param l2
* example:2->9->5
* @return
* example:9->1->2
*/
public ListNode addListNode2(ListNode l1, ListNode l2) {
Stack<Integer> stack1 = getListNodeStack(l1);
Stack<Integer> stack2 = getListNodeStack(l2);
ListNode result = new ListNode(0);
int flag = 0; // 進(jìn)位標(biāo)志
// 對于兩個(gè)鏈表,長度相等時(shí)計(jì)算
while (!stack1.isEmpty() && !stack2.isEmpty()) {
int value = stack1.pop() + stack2.pop() + flag;
flag = value / 10;
value = value % 10;
// 創(chuàng)建一個(gè)新的節(jié)點(diǎn)
ListNode curr = new ListNode(value);
// 當(dāng)前節(jié)點(diǎn)的next 指向之前的一個(gè)節(jié)點(diǎn)
curr.next = result.next;
// 將當(dāng)前節(jié)點(diǎn)存儲起來
result.next = curr;
}
// 當(dāng)?shù)谝粋€(gè)鏈表長度大于第二個(gè)鏈表長度時(shí)
while (!stack1.isEmpty()) {
int value = stack1.pop() + flag;
flag = value / 10;
value = value % 10;
// 創(chuàng)建一個(gè)新的節(jié)點(diǎn)
ListNode curr = new ListNode(value);
// 當(dāng)前節(jié)點(diǎn)的next 指向之前的一個(gè)節(jié)點(diǎn)
curr.next = result.next;
// 將當(dāng)前節(jié)點(diǎn)存儲起來
result.next = curr;
}
// 當(dāng)?shù)诙€(gè)鏈表長度大于第一個(gè)鏈表長度時(shí)
while (!stack2.isEmpty()) {
int value = stack2.pop() + flag;
flag = value / 10;
value = value % 10;
// 創(chuàng)建一個(gè)新的節(jié)點(diǎn)
ListNode curr = new ListNode(value);
// 當(dāng)前節(jié)點(diǎn)的next 指向之前的一個(gè)節(jié)點(diǎn)
curr.next = result.next;
// 將當(dāng)前節(jié)點(diǎn)存儲起來
result.next = curr;
}
// 如果flag等于1,則需要?jiǎng)?chuàng)建一個(gè)新的節(jié)點(diǎn)
if (flag == 1) {
ListNode curr = new ListNode(1);
curr.next = result.next;
result.next = curr;
}
return result.next;
}
/**
* 將鏈表存儲到棧里面
*
* @param node
* @return Stack
*/
public Stack<Integer> getListNodeStack(ListNode node) {
Stack<Integer> stack = new Stack<>();
while (node != null) {
stack.push(node.val);
node = node.next;
}
return stack;
}
}
鏈表求和(lintcode 167題以及221題)
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- 題目 描述 你有兩個(gè)用鏈表代表的整數(shù),其中每個(gè)節(jié)點(diǎn)包含一個(gè)數(shù)字。數(shù)字存儲按照在原來整數(shù)中相反的順序,使得第一個(gè)數(shù)字...
- 你有兩個(gè)用鏈表代表的整數(shù),其中每個(gè)節(jié)點(diǎn)包含一個(gè)數(shù)字。數(shù)字存儲按照在原來整數(shù)中相反的順序,使得第一個(gè)數(shù)字位于鏈表的開...
- 版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。 難度:中等 要求: 你有兩個(gè)用鏈表代表的整數(shù),其中每個(gè)節(jié)點(diǎn)包...
- 夜半窗外風(fēng)怒號, 歲末心頭鼓急敲。 猶記豪情放新鷂, 可憐軀殘斷老腰。 臥床拜仙求神術(shù), 冰凍斗志不枯槁。 只待天...