合并两个有序的链表
面试常考题目:要求时间复杂度为O(n),空间复杂度为O(1)
还可以适当变形,改成合成k个有序的链表
public class leetcode23 { public ListNode mergeKLists(ListNode[] lists) { int len = lists.length; if (len == 0) return null; ListNode res = lists[0]; for (int i = 1; i < len; i++) { res = merge2Lists(res, lists[i]); } return res; } // 合并两个有序链表 时间复杂度为O(n+m),原地计算所以空间复杂度为O(1) public ListNode merge2Lists(ListNode l1, ListNode l2) { if (l1 == null) return l2; if (l2 == null) return l1; // 头结点head,只是起到哨兵的作用;尾节点tail用来链接 ListNode head = new ListNode(0); ListNode tail = head, ptr_1 = l1, ptr_2 = l2; while (ptr_1 != null && ptr_2 != null) { if (ptr_1.val <= ptr_2.val) { tail.next = ptr_1; ptr_1 = ptr_1.next; } else { tail.next = ptr_2; ptr_2 = ptr_2.next; } tail = tail.next; } // 如果存在某一个链表有剩余 tail.next = (ptr_1 == null)? ptr_2: ptr_1; return head.next; } }
作者:Ryanjie
出处:http://www.cnblogs.com/ryanjan/
本文版权归作者和博客园所有,欢迎转载。转载请在留言板处留言给我,且在文章标明原文链接,谢谢!
如果您觉得本篇博文对您有所收获,觉得我还算用心,请点击右下角的 [推荐],谢谢!