题目:
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
思路:
整体思路类似归并排序,选择两个链表 l1,l2 中较小的元素加入新的链表l3,最后若l1,l2中一个遍历完,另一个链表还有元素未遍历,则将未遍历的元素直接添加到l3的末尾。
代码:
/**
* 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) {
if(l1==null){
return l2;
}
if(l2==null){
return l1;
}
ListNode p,q,r,l3;
p = l1;
q = l2;
if(p.val>q.val){
l3 = new ListNode(q.val);
q = q.next;
}else{
l3 = new ListNode(p.val);
p = p.next;
}
r = l3;
while(p!=null&&q!=null){
if(p.val>q.val){
r.next = q;
q = q.next;
}else{
r.next = p;
p = p.next;
}
r = r.next;
}
if(p==null){
r.next = q;
}
if(q==null){
r.next = p;
}
return l3;
}
}
优化:
可不使用额外的辅助链表 l3,而是直接将合并的结果放入l1,由于链表插入的时间复杂度为O(1),整体时间复杂度和空间复杂度都不会太高,并未尝试 -.-!