刷力扣明白了官网代码的小心机(代码的优化)
刷力扣明白了官網代碼的小心機(代碼的優化)
1、203_移除鏈表元素:
//我這道題這樣干的話,就得去分開討論最后一個結點是val時要怎么處理了
// public ListNode removeElements2(ListNode head, int val) {
// if(head == null) return null;
// //好處,我想到了就是定義進入一個虛擬頭結點
// ListNode newHead = new ListNode(0);
// newHead.next = head;
// while(head != null) {
// if(val == head.val) { //找到了(還得考慮head.next是否為空,同時若當前待刪除結點是最后一個的話,咱還得找到前一個,(解決可以定義一個prev 指針變量))
// head.val = head.next.val;
// head.next = head.next.next;
// }else {
// head = head.next;
// }
//
// }
// return newHead.next;
// }
官網:
|
//官網:秒啊: while (temp.next != null) , (通過 當前結點的next 去判斷是否是待刪除結點,若是,當前結點就相當于待刪除結點的前一個結點了) /** 將開始遍歷的位置移動到了虛擬頭結點的位置(然后,通過next進行判斷),這樣即使最后一個結點就是待刪除結點,也可以輕輕松松刪除 ... } |
//官網代碼:
class Solution {
public ListNode removeElements(ListNode head, int val) {
ListNode dummyHead = new ListNode(0);
dummyHead.next = head;
ListNode temp = dummyHead;
while (temp.next != null) {
if (temp.next.val == val) {
temp.next = temp.next.next;
} else {
temp = temp.next;
}
}
return dummyHead.next;
}
}
2、2_兩數相加:
//自己寫的就是代碼太啰嗦了(思路跟官網一樣)
public ListNode addTwoNumbers2(ListNode l1, ListNode l2) {
if(l1 == null && l2 == null) return null;
if(l1 == null && l2 != null) return l2;
if(l1 != null && l2 == null) return l1;
ListNode ptr1 = l1;
ListNode ptr2 = l2;
ListNode head = new ListNode(0);
ListNode tmp = head;
int carry = 0;
int sum = 0;
while(ptr1 != null && ptr2 != null) {
sum = ptr1.val + ptr2.val + carry; //考慮到進位的情況
//考慮進位
carry = sum / 10;
sum %= 10;
ListNode p = new ListNode(sum);
tmp.next = p;
tmp = p;
ptr1 = ptr1.next;
ptr2 = ptr2.next;
}
while(ptr1 != null) {
//tmp 繼續走
sum = ptr1.val + carry; //考慮到進位的情況
carry = sum / 10;
sum %= 10;
ListNode p = new ListNode(sum);
tmp.next = p;
tmp = p;
ptr1 = ptr1.next;
}
while(ptr2 != null) {
//tmp 繼續走
sum = ptr2.val + carry; //考慮到進位的情況
carry = sum / 10;
sum %= 10;
ListNode p = new ListNode(sum);
tmp.next = p;
tmp = p;
ptr2 = ptr2.next;
}
if(carry != 0){//最后一位處理
ListNode p = new ListNode(carry);
tmp.next = p;
}
return head.next;
}
|
//官網的方法:官網用 || 把所有情況考慮在一起了, */ |
//然后 在 || 的情況下,拿到頭結點的初始值(經過是否為空,空的初始值 為 0,否則就是頭結點的值)
class Solution2 {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode head = null, tail = null; //從無到有,硬生生構建出一條鏈表(需要有兩個指針(或者一個頭結點和一個指針):其中一個指針用來實現遍歷到下一個位置去創建結點,然后next 連起來,一個就是head啦)
int carry = 0;
while (l1 != null || l2 != null) {
//拿到頭結點的初始值(經過是否為空,空的初始值 為 0,否則就是頭結點的值)
int n1 = l1 != null ? l1.val : 0;
int n2 = l2 != null ? l2.val : 0;
int sum = n1 + n2 + carry;
if (head == null) { //構建第一個結點時
head = tail = new ListNode(sum % 10);
} else {
tail.next = new ListNode(sum % 10);
tail = tail.next;
}
carry = sum / 10;
if (l1 != null) {
l1 = l1.next;
}
if (l2 != null) {
l2 = l2.next;
}
}
if (carry > 0) { //最后一位的考慮
tail.next = new ListNode(carry);
}
return head;
}
}
總結
以上是生活随笔為你收集整理的刷力扣明白了官网代码的小心机(代码的优化)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: thinkphp自定义模板标签(一)
- 下一篇: 《学习高手》总结