题目
- 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。
示例
- 示例1
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
代码
- 双指针遍历
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode cur1 = l1,cur2 = l2;
ListNode dummy = new ListNode(0);
ListNode p = dummy;
while(cur1 != null || cur2 != null){
// 这里要么其中一个为 null,要么都不为 null
if(cur2 == null || (cur1 != null && cur1.val < cur2.val)){
p.next = cur1;
cur1 = cur1.next;
}else{ // 这里的 cur2 肯定不会为 null
p.next = cur2;
cur2 = cur2.next;
}
p = p.next;
}
return dummy.next;
}
}
代码分析
:1、虽然这道题不难,但还是没想到能一次过。
// 这里要么其中一个为 null,要么都不为 null
if(cur2 == null || (cur1 != null && cur1.val < cur2.val)){
p.next = cur1;
cur1 = cur1.next;
}else{ // 这里的 cur2 肯定不会为 null
p.next = cur2;
cur2 = cur2.next;
}
p = p.next;
2、能来到 while 里面,说明 要么其中一个为 null,要么都不为 null
,接下来就是要考虑其中一个为 null 的情况,如果 cur2 为 null,那就使用 cur1 就行了;如果 cur2 不为空,就转去执行 else 里的 cur2 即可。
if(cur2 == null || (cur1 != null && cur1.val < cur2.val)
3、这里的 cur1 != null
是一定要的,因为能走到 “||” 的后面,说明前面的不成立,即 cur2 不为空,那 cur1 就有可能为 null,因为这里的 cur1 和 cur2 必有一个为 null。
4、到这里,我感觉自己是有一些提升的,考虑的会周到一些,减少 bug 往往需要的就是一点点思考。