合并有序链表
题目:
思路:
思路一:其实一看到这个题我们首先会想到递归,其中比较绕的就是
new_list = l1;
new_list.next = mergeTwoLists2(l1.next, l2);
这点代码,原因是他取出一个值小的节点,并改变了他的下一位节点的指向。
如A->C->E与B->D->F,第一步,若A最小,那么我这个时候用new_list代替A,那么它的下一个节点必然是其他节点中值最小的。第二部进入到了第二层,这时候new_list 又被赋值指向了B,但是你要记住在内存中A并没有变化,有的只是new_list这个代号被B用了,这时候B就自然而然的承接在A的下面然后B的下一位节点必然是其余中的最小的。以此类推,等递归到最后一层的时候,每次返回必然会自然而然的承接上自己的头结点,递归结束后的new_list便指向新链表的头结点的地址。
思路二:就是不用递归而用循环,归其缘由是递归会导致创建新的东西,层数越多,建的越多,消耗越大。而循环相对消耗小一些,但是会比较麻烦,写多点代码吧。不用递归的话要先手判断,两个链表的头结点的值,取其中小的,用两个变量进行存储。为什么要两个,因为一个用于循环是一层层往下面加节点,一个用于返回,不然你循环完了,却又给不出头结点,那不就废了嘛。
代码示例:
class ListNode {
int val;
ListNode next = null;
}
public class Solution {
public static void main(String[] args) {
ListNode l1 = new ListNode();
ListNode l2 = new ListNode();
l1.val = 1;
l2.val = 2;
ListNode top1 = l1;
ListNode top2 = l2;
for (int i = 3; i < 10; i = i + 2) {
ListNode temp1 = new ListNode();
temp1.val = i;
top1.next = temp1;
top1 = temp1;
ListNode temp2 = new ListNode();
temp2.val = i + 1;
top2.next = temp2;
top2 = temp2;
}
ListNode test1 = l1;
ListNode test2 = l2;
System.out.println("第一个链表");
while (test1 != null) {
System.out.println(test1.val);
test1 = test1.next;
}
System.out.println("第二个链表");
while (test2 != null) {
System.out.println(test2.val);
test2 = test2.next;
}
System.out.println("end");
ListNode end = mergeTwoLists2(l1, l2);
while (end != null) {
System.out.println(end.val);
end = end.next;
}
}
/**
* 使用递归的方式进行合并两个列表
*
* @param l1
* @param l2
* @return
*/
public static ListNode mergeTwoLists2(ListNode l1, ListNode l2) {
if (l1 == null)
return l2;
if (l2 == null)
return l1;
ListNode new_list = null; //初始化链表头
if (l1.val <= l2.val) {
new_list = l1;
new_list.next = mergeTwoLists2(l1.next, l2);
} else {
new_list = l2;
new_list.next = mergeTwoLists2(l1, l2.next);
}
return new_list;
}
/**
* 使用循环的方式进行合并两个列表
*
* @param l1
* @param l2
* @return
*/
public static ListNode mergeTwoLists1(ListNode l1, ListNode l2) {
if (l1 == null)
return l2;
if (l2 == null)
return l1;
ListNode new_list = null; //初始化链表头
if (l1.val <= l2.val) {
new_list = l1;
l1 = l1.next;
} else {
new_list = l2;
l2 = l2.next;
}
ListNode new_list_head = new_list; //建立一个指向头部的不变动的变量,因为new_list接下来会不断的往链表下成补充数据,直至底部
while (l1 != null || l2 != null) {
if (l1 != null && l2 != null) {
if (l1.val < l2.val) {
new_list.next = l1;
l1 = l1.next;
} else {
new_list.next = l2;
l2 = l2.next;
}
} else if (l1 == null) {
new_list.next = l2;
l2 = l2.next;
} else if (l2 == null) {
new_list.next = l1;
l1 = l1.next;
}
new_list = new_list.next;
}
return new_list_head;
}
}