时间是2016年7月21日,MTV onsite,第三轮,第一题。
参考leetcode的第21题,要求很简单,将两个排好序的链表合并成一个新的排好序链表。 1->2->5
和 3->4->6
两个输入值,得到 1->2->3->4->5->6
。这题简单的就像小时候动画片结束之后的有奖问答。
两个链表各起一个指针,再建一个head指针,用来寻找下一个排好序的值。必须要说,这题需要对链表这种结构的熟悉,动画片的有奖竞猜也是要看动画片的。
public class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { //做个dummy node,防止两个链表里面有空的。 ListNode dummy = new ListNode(0); ListNode head = dummy; //分别建两个指针,指向l1和l2,在后来可以预防链表出界。 ListNode p1 = l1; ListNode p2 = l2; while(p1 != null && p2 != null){ //按照大小找下一个节点。 if(p1.val < p2.val){ head.next = p1; p1 = p1.next; } else{ head.next = p2; p2 = p2.next; } head = head.next; } //最后别忘了接剩余的部分 if(p1 != null){ head.next = p1; } else if(p2 != null){ head.next = p2; } return dummy.next; } }
复杂度是O(n)吧,好像链表题目很少有其他复杂度的,只有扫一遍,扫两遍,扫大街的区别。
在test case设计的时候,先找个正常的,比如 1->3
, 2->4
的组合。然后可以验证空的node能否跑通,就是l1是null,或l2是null,或两个都是null。还有一个链表很小,另一个很大。比如 1->2
, 5->6->7->8
这样。这些差不多了吧。
其实这道题就是用来开启Google面经这个标签的,准备今年9月投一下Google,尽早准备。我是今年秋天要放飞理想的有志青年,面对众多IT公司对转行者的歧视,你们尽管一起上,何惧操,随便射。