刷力扣明白了官网代码的小心机(代码的优化)
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 去判断是否是待删除结点,若是,当前结点就相当于待删除结点的前一个结点了)
... } |
//官网代码: 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; } }