题目
将两个排序的链表合并,返回一个新链表,返回的新链表也是排好序的
代码
package algorithm6;
public class Algorithm6 {
public static void main(String[] args) {
ListNode merge = mergeListNodesBySelf(getListNode1(), getListNode4());
System.out.println(merge.toString());;
}
/**方法一:不打算实现的方法
* 思路:第一反应的思路,就是利用一个数组
* 分别遍历两个链表,将所有数据存放到数组中
* 然后再对数组进行排序
* 最后利用排好序的数组,构建链表
*
*/
/**方法二:
* 思路:合并两个已经排序的链表,其实就是同时遍历两个链表
* 在遍历链表的过程中,比较两个链表当前节点的大小,并组成新的链表
* 那么在遍历的过程中,就需要有一个节点代表新的链表;
* 还需要一个节点代表新链表将要被赋值的位置节点,这个节点是需要随着遍历而不断更新,才能保证是最新位置
* 遍历过程中,按照节点大小对比,判定需要前进的链表
* 优点:思路清晰简单,时间复杂度自然就是 O(n)
*
* @param listNode1
* @param listNode2
* @return
*/
public static ListNode mergeListNodes(ListNode listNode1, ListNode listNode2) {
if(listNode1 == null) return listNode2;
if(listNode2 == null) return listNode1;
ListNode pointer = new ListNode(0);
ListNode head = pointer;
while(listNode1 != null && listNode2 != null) {
if(listNode1.content < listNode2.content) {
pointer.next = listNode1;
pointer = pointer.next;
listNode1 = listNode1.next;
}else {
pointer.next = listNode2;
pointer = pointer.next;
listNode2 = listNode2.next;
}
}
if(listNode1 == null && listNode2!= null) {
pointer.next = listNode2;
}
if(listNode2 == null&& listNode1!= null) {
pointer.next = listNode1;
}
return head.next;
}
/**方法三:
* 思路:递归,一种思路清晰,但是编码却有一定难度的解法
* 对两个链表的节点做比较,返回较小的节点,再为该节点的next节点赋值;
* 所谓赋值就是,将较小的链表推进一位,在与另外一个链表节点继续比较;
* 最终遍历完两个链表的所有节点,程序自然也就结束了
* 优点:思路清晰,时间复杂度依然是 O(n)
*
* @param listNode1
* @param listNode2
* @return
*/
public static ListNode mergeListNodesBySelf(ListNode listNode1, ListNode listNode2) {
if(listNode1 == null) return listNode2;
if(listNode2 == null) return listNode1;
ListNode head = null;
if(listNode1.content < listNode2.content) {
head = listNode1;
head.next = mergeListNodesBySelf(listNode1.next, listNode2);
}else {
head = listNode2;
head.next = mergeListNodesBySelf(listNode1, listNode2.next);
}
return head;
}
public static ListNode getListNode1() {
ListNode listNode1 = new ListNode(1);
ListNode listNode3 = new ListNode(3);
ListNode listNode5 = new ListNode(5);
ListNode listNode7 = new ListNode(7);
ListNode listNode9 = new ListNode(9);
ListNode listNode12 = new ListNode(12);
listNode1.next = listNode3;
listNode3.next = listNode5;
listNode5.next = listNode7;
listNode7.next = listNode9;
listNode9.next = listNode12;
return listNode1;
}
public static ListNode getListNode2() {
ListNode listNode2 = new ListNode(2);
ListNode listNode4 = new ListNode(4);
ListNode listNode6 = new ListNode(6);
ListNode listNode8 = new ListNode(8);
ListNode listNode10 = new ListNode(10);
listNode2.next = listNode4;
listNode4.next = listNode6;
listNode6.next = listNode8;
listNode8.next = listNode10;
return listNode2;
}
public static ListNode getListNode3() {
return null;
}
public static ListNode getListNode4() {
ListNode listNode2 = new ListNode(1);
ListNode listNode4 = new ListNode(4);
ListNode listNode8 = new ListNode(8);
ListNode listNode10 = new ListNode(13);
listNode2.next = listNode4;
listNode4.next = listNode8;
listNode8.next = listNode10;
return listNode2;
}
}