1.题目
输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。
要求:空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)
2.解法1
创建dummy
和head
节点,返回dummy.next。
比较链表各自节点大小,并加入小的到head.next。
如果其中一个链表处理完了,就把另一个加入到head.next。
public ListNode Merge(ListNode list1, ListNode list2) {
if(list1==null) return list2;
if(list2==null) return list1;
ListNode dummy = new ListNode(-1);
ListNode head = dummy;
while (list1!=null&&list2!=null){
if(list1.val< list2.val){
head.next = list1;
list1 = list1.next;
}
else {
head.next = list2;
list2 = list2.next;
}
head = head.next;
}
ListNode l = list1==null?list2:list1;
head.next = l;
return dummy.next;
}
总结
使用哑结点dummy,并且注意链表处理后,需要对没有比较完成的链表做一个链接
。
算法系列在github上有一个开源项目,主要是本系列博客的demo代码。https://github.com/forestnlp/alg
如果您对软件开发、机器学习、深度学习有兴趣请关注本博客,将持续推出Java、软件架构、深度学习相关专栏。
您的支持是对我最大的鼓励。