题解 | #合并两个排序的链表#
合并两个排序的链表
http://www.nowcoder.com/practice/d8b6b4358f774294a89de2a6ac4d9337
思路
1.队列,通过先进先出的特性,可以将链表进行一个排序,然后再将链表串起来。
2.比较创建新链表,遍历,一次遍历就创建新的链,谁小谁被串。
结果
1.队列
运行时间:19ms
占用内存:10900KB
2.比较创建新链表
运行时间:22ms
占用内存:10788KB
代码
1.队列
public ListNode Merge(ListNode list1,ListNode list2) { ArrayDeque<ListNode> queue = new ArrayDeque<>(); while (list1 != null || list2 != null){ if (list1 == null) queue.add(list2); else if (list2 == null) queue.add(list1); else if (list1.val >= list2.val) queue.add(list2); else queue.add(list1); if (queue.peekLast() == list1) list1 = list1.next; else list2 = list2.next; } ListNode peek = queue.peek(); while (!queue.isEmpty()){ ListNode topNode = queue.pollFirst(); topNode.next = queue.peek(); } return peek; }
2.比较创建新链表
public ListNode Merge(ListNode list1,ListNode list2) { if (list1 == null || list2 == null) return list1==null?list2:list1; ListNode newListHead = list1.val >= list2.val?list2:list1; ListNode newList = newListHead; if (newList == list1) list1 = list1.next; else list2 = list2.next; while (list1 != null || list2 != null){ if (list1 == null) { newList.next = list2; return newListHead; }else if (list2 == null){ newList.next = list1; return newListHead; }else { if (list1.val >= list2.val) { newList.next = list2; list2 = list2.next; } else{ newList.next = list1; list1 = list1.next; } newList = newList.next; } } return newListHead; }