题目:
Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.
Example:
Input: 1->2->4, 1->3->4
Output: 1->1->2->3->4->4
解答:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode dummy = new ListNode(0);
ListNode p=dummy;
if(l1 == null) {
return l2;
} else if(l2 == null) {
return l1;
} else if(l1 == null && l2 == null) {
return null;
}
while(l1 != null && l2 != null){
if(l1.val<=l2.val){
p.next=l1;
p=l1;
l1=l1.next;
}else{
p.next=l2;
p=l2;
l2=l2.next;
}
}
if(l1==null){
p.next=l2;
}
if(l2==null){
p.next=l1;
}
return dummy.next;
}
}
注意:
- 在一开始写这道题时,一定要注意边界条件,若边界条件不判别好,程序输出有错。
如果链表l1比链表l2长,那么很可能会出现l2已经遍历完了,而l1还有剩余的情况。由于l1是有序链表,所以只需要将剩下的l1中的节点全加到node后面去即可;
反之亦然。
还有不能忘记的是l1和l2为空的问题:
如果l1和l2均为空链表,直接返回null;
如果l1和l2其中一个为空,则直接返回另一个链表即可,这样有利于减少计算量。 - 注意题中无头结点,则我们应该采用虚拟头结点。设置好dummy节点,令q指向dummy,即q = dummy;
然后对l1和l2中的每个节点进行遍历