题目来源:牛客网--合并两个排序的链表
题目描述
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
解题思路
新定义一个链表,循环取 list1 和list2 当前值的较小值,然后把被取值的链表向后移动。当其中一个链表遍历结束时,就把另一个链表的后半部分合并
两种实现方式:普通循环 和 递归实现,其中递归是我在讨论区看到的,思路很清晰。
提交代码
一、 普通循环遍历
static ListNode merge(ListNode list1,ListNode list2) {
// 为了方便循环,先随意定义一个节点
ListNode curNode = new ListNode(-1);
// 使用result 记录这个节点,result.next就是新链表的头节点了
ListNode result = curNode;
// 一直遍历到其中一个链表末尾
while (list1 != null && list2 != null) {
if (list1.val > list2.val) {
curNode.next = list2;
list2 = list2.next;
} else {
curNode.next = list1;
list1 = list1.next;
}
curNode = curNode.next;
}
// 把没有结束的那个链表部分合并到结果中
if (list1 == null) {
curNode.next = list2;
}
if (list2 == null) {
curNode.next = list1;
}
return result.next;
}
二、 递归实现
static ListNode mergeList(ListNode list1, ListNode list2){
if (list1 == null){
return list2;
}
if (list2 == null){
return list1;
}
if (list1.val < list2.val) {
list1.next = mergeList(list1.next, list2);
return list1;
} else {
list2.next = mergeList(list1, list2.next);
return list2;
}
}
本地测试代码
/**
* 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则
* @author jiayanzhao
*/
public class MergeList {
public static void main(String[] args) {
ListNode list1 = new ListNode(2);
list1.next = new ListNode(4);
ListNode list2 = new ListNode(3);
list2.next = new ListNode(5);
// printResult(Merge(list1, list2));
printResult(mergeList(list1, list2));
}
// 非递归实现
static ListNode merge(ListNode list1,ListNode list2) {
// 为了方便循环,先随意定义一个节点
ListNode curNode = new ListNode(-1);
// 使用result 记录这个节点,result.next就是新链表的头节点了
ListNode result = curNode;
// 一直遍历到其中一个链表末尾
while (list1 != null && list2 != null) {
if (list1.val > list2.val) {
curNode.next = list2;
list2 = list2.next;
} else {
curNode.next = list1;
list1 = list1.next;
}
curNode = curNode.next;
}
// 把没有结束的那个链表部分合并到结果中
if (list1 == null) {
curNode.next = list2;
}
if (list2 == null) {
curNode.next = list1;
}
return result.next;
}
// 递归实现 这个是我在讨论区看到的,感觉很好。
static ListNode mergeList(ListNode list1, ListNode list2){
if (list1 == null){
return list2;
}
if (list2 == null){
return list1;
}
if (list1.val < list2.val) {
list1.next = mergeList(list1.next, list2);
return list1;
} else {
list2.next = mergeList(list1, list2.next);
return list2;
}
}
// 输出链表
static void printResult(ListNode result) {
while (result != null){
System.out.println(result.val);
result = result.next;
}
}
}
//class ListNode {
// int val;
// ListNode next = null;
//
// ListNode(int val) {
// this.val = val;
// }
//}