今天在做算法題時遇到鏈表無法正常返回,有時返回爲空,有時返回只有一個一個節點。
經過反覆思考和查看他人代碼,我得到兩點心得在此記錄。
1.不要覆蓋節點
新節點應該穿件後不能直接賦值給node而是要賦值給node.next即
node.next = new Node();
2.移動節點前保留頭結點
這點很重要,最初忘記保留這個節點,返回後只有一個數據,先前數據丟失在二次元(真是可以說是泯滅,無形的消失,但有實際存在)。
下面是今天AC的題:
給出兩個 非空 的鏈表用來表示兩個非負的整數。
其中,它們各自的位數是按照 逆序 的方式存儲的,
並且它們的每個節點只能存儲 一位 數字。如果,我們將這兩個數相加起來
,則會返回一個新的鏈表來表示它們的和。
您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。
示例:
輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
輸出:7 -> 0 -> 8
原因:342 + 465 = 807
解題:
@Test
public void test(){
ListNode l1 = new ListNode(2);
l1.next = new ListNode(4);
l1.next.next = new ListNode(3);
System.out.println("鏈表"+l1.next.val);
ListNode l2 = new ListNode(5);
l2.next = new ListNode(6);
l2.next.next = new ListNode(4);
ListNode listNode = addTwoNumbers(l1, l2);
System.out.println("內容"+listNode.val);
}
public class ListNode {
//節點類
int val;
ListNode next;
ListNode(int x) { val = x; }
}
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
//創建返回列表
ListNode list = new ListNode(0);
//這裏表示保留頭結點
ListNode lists = list;
int sum = 0;
//迭代所有節點
while(l1 != null || l2!= null){
if(l1!=null) {
sum+=l1.val;
l1 = l1.next;
}
if(l2!=null) {
sum+=l2.val;
l2 = l2.next;
}
//求和取餘
lists.next = new ListNode(sum%10);
sum/=10;
//節點向移動
lists = lists.next;
}
//確定有沒有進位
if(sum>=1) {
lists.next = new ListNode(sum);
}
return list.next;
}
註明:以上內容如有爭議、指正,留言給我~