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